Vue前端架构学习(一)

本文我们主要和大家分享vue前端架构学习(一),这是一篇从零开始做vue前端架构的分享,希望能帮助到大家。

想想也已经做过不少架构的项目了,有基于vue,基于react,基于thinkPHP,基于laravel的。做多了,也就对现有的架构有各种想法,有好的,有坏的,总之,用起来还是不爽。vue-cli虽然可以很快地构建并使用,尤其是vue-cli v3.0,把webpack都封进@vue/cli的sdk里了,用起来更加干净、简洁。

好了,介绍完毕,接下来,我就从零开始,一步一步建起前后端完全分离的前端架构了。

步骤

由于要介绍的很多,全写在一篇里,有些太长了。

所以,我会分为:

立即学习“前端免费学习笔记(深入)”;

创建开发环境下的webpack配置文件

配置eslint、babel、postcss

创建项目文件、目录架构

通过koa实现本地数据接口模拟

创建发布环境下的webpack配置文件

创建测试环境下的webpack配置文件、以及测试用例 (TODO)

自动初始化构建项目(TODO)

这七篇来分别介绍。

开发

一、初始化项目

创建项目文件夹

我们就叫vue-construct吧

初始化git

git init

初始化npm

npm init

创建项目文件

为了能让webpack跑起来,而不是一口气只讲配置而不运行一下,那样未免有些空洞,所以我们先创建一点项目文件和目录。
在这之前我们先安装两个包:vue、vue-router, npm i -S vue vue-router。
我们将项目代码相关文件都放在名为app的文件夹下。我先都创建完,然后一个个介绍。

├── app│   ├── app.vue│   ├── common│   │   ├── img│   │   ├── js│   │   └── scss│   ├── index.html│   ├── index.js│   ├── router│   │   └── index.js│   └── views│       └── home│           └── index.vue├── .gitignore├── package-lock.json├── package.json└── webpack.config.js

登录后复制

node_modules的话就忽略了。

文件/文件夹 用途

app.vue作为vue的主文件common里面放公共的代码index.html页面模板文件index.js项目主入口文件router放vue对应的router文件views放视图文件.gitignore忽略node_module

咱们暂且不关系这些文件里的具体代码是什么,等webpack配置完再说。

二、配置webpack.config.js

安装一系列的包:

为了webpack的运行,需要安装

webpackwebpack-dev-server

登录后复制

为了处理vue单页文件,安装:

vue-loader

登录后复制

为了处理scss文件并从js中抽离,安装:

node-sassstyle-loadercss-loadersass-loadervue-style-loaderpostcsspostcss-loaderautoprefixerextract-text-webpack-plugin

登录后复制

为了处理图片和字体文件,安装:

file-loaderurl-loader

登录后复制

为了支持高级语法-babel,安装:

babelbabel-loaderbabel-plugin-syntax-dynamic-importbabel-plugin-transform-object-rest-spreadbabel-polyfillbabel-preset-env

登录后复制

为了验证代码格式-eslint,安装:

eslinteslint-loadereslint-plugin-htmlbabel-eslint

登录后复制

配置webpack.config.js文件

const webpack = require('webpack')const path = require('path')const HtmlWebpackPlugin = require('html-webpack-plugin')const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')// 为了抽离出两份CSS,创建两份ExtractTextPlugin// base作为基础的css,基本不变,所以,可以抽离出来充分利用浏览器缓存// app作为迭代的css,会经常改变const isProduction = process.env.NODE_ENV === 'production'const ExtractTextPlugin = require('extract-text-webpack-plugin')const extractBaseCSS =  new ExtractTextPlugin(    {      filename:'static/css/base.[chunkhash:8].css',      allChunks: true,      disable: !isProduction // 开发环境下不抽离css    }  )const extractAppCSS  = new ExtractTextPlugin(    {      filename:'static/css/app.[chunkhash:8].css',      allChunks: true,      disable: !isProduction // 开发环境下不抽离css    }  )// 减少路径书写function resolve(dir) {  return path.join(__dirname, dir)}// 网站图标配置const favicon = resolve('favicon.ico')// __dirname: 总是返回被执行的 js 所在文件夹的绝对路径// __filename: 总是返回被执行的 js 的绝对路径// process.cwd(): 总是返回运行 node 命令时所在的文件夹的绝对路径const config = {  // sourcemap 模式  devtool: 'cheap-module-eval-source-map',  // 入口  entry: {    app: [      'babel-polyfill', // 这里是配合babel-present-env导入的动态babel-polyfill,因此npm需dev依赖      resolve('app/index.js')    ]  },  // 输出  output: {    path: resolve('dev'),    filename: 'index.bundle.js'  },  resolve: {    // 扩展名,比如import 'app.vue',扩展后只需要写成import 'app'就可以了    extensions: ['.js', '.vue', '.scss', '.css'],    // 取路径别名,方便在业务代码中import    alias: {      api: resolve('app/api/'),      common: resolve('app/common/'),      views: resolve('app/views/'),      components: resolve('app/components/'),      componentsBase: resolve('app/componentsBase/'),      directives: resolve('app/directives/'),      filters: resolve('app/filters/'),      mixins: resolve('app/mixins/')    }  },  // loaders处理  module: {    rules: [      {        test: /.js$/,        include: [resolve('app')],        loader: [          'babel-loader',          'eslint-loader'        ]      },      {        test: /.vue$/,        exclude: /node_modules/,        loader: 'vue-loader',        options: {          extractCSS: true,          loaders: {            scss: extractAppCSS.extract({              fallback: 'vue-style-loader',              use: [                {                  loader: 'css-loader',                  options: {                    sourceMap: true                  }                },                {                  loader: 'postcss-loader',                  options: {                    sourceMap: true                  }                },                {                  loader: 'sass-loader',                  options: {                    sourceMap: true                  }                }              ]            })          }        }      },      {        test: /.(css|scss)$/,        use: extractBaseCSS.extract({          fallback: 'style-loader',          use: [            {              loader: 'css-loader',              options: {                sourceMap: true              }            },            {              loader: 'postcss-loader',              options: {                sourceMap: true              }            },            {              loader: 'sass-loader',              options: {                sourceMap: true              }            }          ]        })      },      {        test: /.(png|jpe?g|gif|svg|ico)(?.*)?$/,        loader: 'url-loader',        options: {          limit: 8192,          name: isProduction            ? 'static/img/[name].[hash:8].[ext]'            : 'static/img/[name].[ext]'        }      },      {        test: /.(woff2?|eot|ttf|otf)(?.*)?$/,        loader: 'url-loader',        options: {          limit: 8192,          name: isProduction            ? 'static/font/[name].[hash:8].[ext]'            : 'static/font/[name].[ext]'        }      }    ]  },  plugins: [    // html 模板插件    new HtmlWebpackPlugin({      favicon,      filename: 'index.html',      template: resolve('app/index.html')    }),    // 抽离出css    extractBaseCSS,    extractAppCSS,    // 热替换插件    new webpack.HotModuleReplacementPlugin(),    // 更友好地输出错误信息    new FriendlyErrorsPlugin()  ],  devServer: {    proxy: {      // 凡是 `/api` 开头的 http 请求,都会被代理到 localhost:7777 上,由 koa 提供 mock 数据。      // koa 代码在 ./mock 目录中,启动命令为 npm run mock。      '/api': {        target: 'http://localhost:7777', // 如果说联调了,将地址换成后端环境的地址就哦了        secure: false      }    },    host: '0.0.0.0',    port: '9999',    disableHostCheck: true, // 为了手机可以访问    contentBase: resolve('dev'), // 本地服务器所加载的页面所在的目录    // historyApiFallback: true, // 为了SPA应用服务    inline: true, //实时刷新    hot: true  // 使用热加载插件 HotModuleReplacementPlugin  }}module.exports = {  config: config,  extractBaseCSS: extractBaseCSS,  extractAppCSS: extractAppCSS}

登录后复制

总结

这一篇主要就做了三件事:

创建简单的项目结构

安装了这篇,以及之后要用到npm包

配置开发环境的Webpack

相关推荐:

VUE前端cookie简单操作实例分享

以上就是Vue前端架构学习(一)的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2787740.html

(0)
上一篇 2025年3月8日 18:15:04
下一篇 2025年3月2日 10:55:49

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 常见前端跨域解决方案分享

    什么是跨域? 跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的。本文主要和大家介绍前端常见跨域解决方案的相关内容,包括对跨域的解释,常见跨域场景以及跨域解决方案,内容丰富,希望能帮助到大家。 广义的跨域: 1.) 资…

    编程技术 2025年3月8日
    200
  • 几个免费的web前端开发工具

    本文主要和大家介绍十个免费的web前端开发工具详细整理的相关资料,希望通过本文大家能够理解使用免费web开发工具,需要的朋友可以参考下,希望能帮助到大家。 十个免费的web前端开发工具 网络技术发展迅速,部分技术难以保持 立即学习“前端免费…

    2025年3月8日 编程技术
    200
  • 一起来学习Cookie

    本文主要和大家cookie一起来学习cookie,如果非要用汉语理解cookie的话应该是 一段小型文本文件,由网景的创始人之一的卢 蒙特利在93年发明。希望本文能帮助到大家。 实现基本的注册功能 我们打开网站,浏览网站,最常见的两个操作就…

    2025年3月8日 编程技术
    200
  • JS基础前端知识点总结

    1.javascript概述(了解) 1.什么是javascript javascript简称为js,是一种运行于js解释器/引擎中的脚本语言js的运行环境:1.独立安装的js解释器(node)2.嵌入在浏览器内核中的js解释器 登录后复制…

    编程技术 2025年3月8日
    200
  • 新手学习vue详解

    这次给大家带来新手学习vue详解,新手学习vue注意事项有哪些,下面就是实战案例,一起来看一下。 vue当前端最好的框架之一 首先我们根据官网的文档 #特别注意 Vue.js 不支持 IE8 及其以下版本,因为 Vue.js 使用了 IE8…

    2025年3月8日
    200
  • vue实践小结之mvvm学习

    MVVM是Model-View-ViewModel的简写。微软的WPF带来了新的技术体验。本文主要和大家分享vue实践小结之mvvm学习,希望能帮助到大家。 1 mvvm 学习 1.1 实现原理 mvvm类框架的实现原理不复杂,大致如下: …

    2025年3月8日 编程技术
    200
  • react.js的学习

    这次给大家带来react.js的学习,react.js学习的注意事项有哪些,下面就是实战案例,一起来看一下。 react本质上是一个状态机,可以帮助开发者管理复杂的随时间变化的状态。它以一个精简的模型实现了这一点,react只关心两件事: …

    编程技术 2025年3月8日
    200
  • 前端为什么要使用模块化?

    这次给大家带来前端为什么要使用模块化?,前端模块化的模块化有哪些,下面就是实战案例,一起来看一下。 CMD、AMD、CommonJS 规范分别指什么?有哪些应用 AMD (Asynchronous Module Definition, 异步…

    编程技术 2025年3月8日
    200
  • ajax的学习笔记

     这次给大家带来ajax的学习笔记,使用ajax的注意事项有哪些,下面就是实战案例,一起来看一下。 XMLHttpRequest原型对象:   let xhr = new XMLHttpRequest();  //new一个XMLHttpR…

    2025年3月8日 编程技术
    200
  • 实用:快速定位前端界面交互JS代码

    本次的这篇文章主要是和大家分享了关于快速定位前端界面交互js代码 ,有需要的小伙伴可以看一下 后端同事问到怎么看这块交互的代码。 右键 UI, 检查元素,再右键元素打断点。 Break on: attribute modifications…

    2025年3月8日
    200

发表回复

登录后才能评论