VUE学习:三.VueCLI 配置
前言
掌握一些项目中常见的 webpack 配置,能够从容应对一些开发场景问题
#1.vue-cli 2.x
#1.1 css 相关
style-loader ( 处理 style 内联样式 )
css-loader (处理.css 文件)
postcss-loader (处理 css 兼容)
less-loader (处理.less 文件)
sass-loader (处理.sass/.scss 文件)
let comment = [ "style-loader", "css-loader", { loader: "postcss-loader", options: { postcssOptions: { plugins: ["postcss-preset-env"], }, }, },]module.exports = { module: { rules: [ { test: /.css/, use: [...comment], }, { test: /.less$/, use: [...comment, "less-loader"], }, ], },}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#1.2 js 相关
babel-loader
@babel/core
@babel/preset-env
@babel/polyfill
module.exports = { entry:['@babel/polyfill','./src/index.js'] ... module:{ rules:[ { test:/.js$/, use:[ { loader:'babel-loader', options:{ presets:['@babel/preset-env'] // 或者 presets:[['env',{module:false}]] } } ] } ] }}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#1.3 文件相关
url-loader
file-loader
html-loader
module.exports = { ... module:{ rules:[ { test:/.(png|jpg|gif)$/, use:[ { loader:file-loader, options:{ limit:4 *1024, name:'img/[name]_[hash:10].[ext]' } } ] }, { test:/.html$/, loader:'html-loader' } ] } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#1.4 vue 相关
vue-loader
vue-style-loader
module.exports = { ... module:{ rules:[ { test:/.vue$/, loader:'vue-loader' }, { test:/.css$/, use:[ 'vue-style-loader', 'css-loader' ] } ] } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#2.vue-cli 3.x
#2.1 默认配置
vue-cli 3.x 为我们默认封装了项目运行常用的 webpack 配置
除了使用
vue inspect plugins
我们还可以通过运行vue ui
进入可视化页面查看
const VueLoaderPlugin = require("vue-loader/lib/plugin") // vue-loader 是webpack的加载器,允许你以单文件组件的格式编写vue组件const { DefinePlugin } = require("webpack") // webpack 内置插件,用于创建编译时可以配置的全局常量const CaseSensitivePathsPlugin = require("case-sensitive-paths-webpack-plugin") // 用于强制所有默认的完整路径必须与磁盘上实际路径的确切大小写相匹配const FriendlyErrorsPlugin = require("friendly-error-webpack-plugin") //识别某些类型的webpack错误并整理,以提供开发人员更好的体验。const MiniCssExtractPlugin = require("mini-css-extract-plugin") // 将css 提取到单独的文件中,为每个包含css的js文件创建一个css文件const { HashedModuleIdsPLugin } = require("webpack") // webpack内置插件,用于根据模块的相对路径生成hash作为模块id,一般用于生产环境const HtmlWebpackPlugin = require("html-webpack-plugin") //用于根据模块或使用加载器生成HTML文件const PreloadPlugin = require("preload-webpack-plugin") // 用于在使用html-webpack-plugin生成的html中添加<link rel="preload" >或<link rel="prefetch">,有助于异步加载const CopyWebpackPlugin = require("copy-webpack-plugin") //用于将单个文件或整个目录复制到构建目录module.exports = { plugins: [ new VueLoaderPlugin(), new DefinePlugin(), new FriendlyErrorsWebpackPlugin(), new MiniCssExtractPlugin(), new OptimizeCssnanoPlugin(), new OptimizeCssnanoPlugin(), new HtmlWebpackPlugin(), new PreloadPlugin(), new CopyWebpackPlugin(), ],}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#2.2 vue.config.js
注意
新创建的 vue 项目没有这个文件,需要自己在根目录创建 vue.config.js
├── vue.config.js │ ├── 其他配置 │ ├── chainWebpack │ ├── configureWebpack │ ├── devServer │ ├── css │ ├── pages
2
3
4
5
6
7
#2.2.1.其他配置
1.配置二级目录:默认打开页面
http://localhost:8080
改为http://localhost:8080/project
publicPath: 'project',
12.配置打包目录:默认
dist
改为mydist
outputDir: 'mydist',
13.配置 source-map:线上环境代码方便调试
productionSourceMap:true,
1
#2.2.2.chainWebapck
更细粒度的控制 webpack 的内部配置,其集成的是webpack-chain
这一插件,该插件可以让我们能够使用链式操作来修改配置
1.url-loader:处理图片
const merge = require('webpack-merge')module.exports = { ... chainWebpack: config => {// config 参数为已经解析好的 webpack配置 config.module .rule('image') .use('url-loader') .tap(options => merge(options,{ // 这里需要注意的是我们使用了 webpack-merge 这一插件,该插件用于做 webpack 配置的合并处理,这样 options 下面的其他值就不会被覆盖或改变 limit: 5120 }) ) } ...}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15以上操作我们可以成功修改 webpack 中 module 项里配置 rules 规则为图片下的 url-loader 值,将其 limit 限制改为 5M
module: { rules: [ { test: /\.(png|jpe?g|gif|webp)(\?.*)?$/, use: [ { loader: "url-loader", options: { limit: 5120, name: "img/[name].[hash:8].[ext]", }, }, ], }, ]}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
162.简化路径
module.exports = { ... chainWebpack: config => {// config 参数为已经解析好的 webpack配置 config.resolve.alias .set('@', resolve('src')) .set('static', resolve('static')) } ... }
2
3
4
5
6
7
8
9
#2.2.3.configureWebpack
除了使用 chainWebpack 配置外,我们还可以使用 configureWebpack 来修改,两者的不同点在于 chianWebpack 是链式修改,而 configureWebapck 更倾向于整体替换和修改
configWbpack 可以直接是一个对象,也可以是一个函数,如果是对象他会直接使用 webpack-merge 对其进行合并处理
configWbpack 如果是函数,你可以直接使用其 config 参数来修改 webpack 中的配置,或者返回一个对象进行 merge 处理
module.exports = { // config 参数为已经解析好的webpack配置 configureWebpack: (config) => { // config.plugins = [];//这样会直接将plugins置空 return { plugins: [], // 使用return 一个对象会通过 webpack-merge进行合并,plugins不会置空 } },}
2
3
4
5
6
7
8
9
项目目录下运行
vue inspect
来查看你修改后的 webpackp 完整配置
vue inspect plugins # 缩小审查范围,只查看 plugins的内容
#2.2.4.devServer
devServer 可以对本地服务器配置,我们在命令中运行的yarn serve
对应的命令vue-cli-service server
其实便是基于 webpack-dev-server 开启的一个本地服务器
module.exports = { devServer: { compress: true, //开发服务器是否启动gzip等压缩 host: "localhost", //开发服务器监听的主机地址 hot: true, hotOnly: true, // 热更新 https: false, // https:{type:Boolean} open: true, overlay: { errors: true, // 让浏览器 overlay 同时显示警告和错误 warnings: false, }, port: 8090, //开发服务器监听的端口 proxy: { //配置不同的后台API地址 "/api": { target: "http://localhost:8090", ws: false, //是否开启websocket changeOrigin: true, //允许跨域 pathRewrite: { "^/api": "/mock", }, }, }, before(app) { // mock数据 }, },}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
当然除了以上参数,其支持所有的 webpack-dev-server 中的选项,比如hostoryApiFallback
用于重写路由、progress 将运行进度输出到控制台等
#2.2.5.css
1.响应式页面
module.exports = { css: { loaderOptions: { postcss: { plugins: [ require("postcss-pxtorem")({ rootValue: 192, // unitPrecision: 5, propList: ["*"], // selectorBlackList: [], // replace: true, mediaQuery: false, minPixelValue: 3, exclude: /node_modules/i, }), ], }, }, },}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2.全局样式 全局
sass
样式文件进行全局引入// vue.config.js...css: { sourceMap: false, loaderOptions: { scss: { additionalData: ` @import "~@/assets/styles/norm.scss"; @import "~@/assets/styles/mixins.scss"; ` }, sass: { additionalData: ` @import "~@/assets/styles/norm.scss" @import "~@/assets/styles/mixins.scss" ` } }}...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
总结
了解 vue 项目中的 vuecli 的作用,以及相关的配置方式,能在项目中遇到相关问题时轻松应对