前言:
vue-cli3以前的版本中把webpack的配置都写在config文件中,可以vue-cli3以上的版本中没有了config目录,可以将配置webpack的文件写在vue.config.js文件里面。
vue.config.js
是一个可选的配置文件,如果项目的 (和 package.json
同级的) 根目录中存在这个文件,那么它会被 @vue/cli-service
自动加载。你也可以使用 package.json
中的 vue
字段,但是注意这种写法需要你严格遵照 JSON 的格式来写。
一、vue.config.js中的基本配置
1、导出:
// vue.config.js
/**
* @type {import('@vue/cli-service').ProjectOptions}
*/
module.exports = {
// 选项...
}
或者也可以用帮手函数defineConfig
// vue.config.js
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
// 选项
})
2、publicPath部署应用包的基本url
默认/,可以设置为相对路径./。
用法和 webpack 本身的 output.publicPath
一致,但是 Vue CLI 在一些其他地方也需要用到这个值,所以请始终使用 publicPath
而不要直接修改 webpack 的 output.publicPath
。
let developmentPath='./';//开发环境-npm run serve时引用文件路径
let productionPath='./';//生产环境-npm run build打包后引用文件路径
module.exports = {
publicPath: process.env.NODE_ENV === 'production' ? productionPath: developmentPath, // 基本路径-引用文件的路
}
3、 outputDir 输出生产环境构建文件的目录
当运行 vue-cli-service build
时生成的生产环境构建文件的目录。
请始终使用 outputDir
而不要修改 webpack 的 output.path
。
outputDir: "dist/html",
4、assetsDir 打包后生成的静态资源目录
放置生成的静态资源 (js、css、img、fonts) 的 (相对于 outputDir
的) 目录。
从生成的资源覆写 filename 或 chunkFilename 时,assetsDir
会被忽略。
assetsDir: 'static',
5、indexPath
指定生成的 index.html
的输出路径 (相对于 outputDir
)。也可以是一个绝对路径。
6、lintOnSave
是否在保存的时候通过eslint-loader检查
如果你想要在生产构建时禁用 eslint-loader
,你可以用如下配置:
// vue.config.js
module.exports = {
lintOnSave: process.env.NODE_ENV !== 'production'
}
7、productionSourceMap
如果你不需要生产环境的 source map,可以将其设置为 false
以加速生产环境构建。默认是true
productionSourceMap: false,
8、 devServer
通过devServer.proxy
选项配置,可解决跨域问题
devServer: {
index: '/index.html', //默认打开文件
open: true, //自动打开浏览器
host: 'localhost', //默认打开域名
port: 8080, //默认打开端口号
https: false, //开启关闭https请求
hotOnly: false, //热更
overlay: {
warnings: false,
errors: true,
},
proxy: {
// 配置跨域
'/api': {
target: 'http://192.168.99.99:8080', //代理地址,这里设置的地址会代替axios中设置的baseURL
changeOrigin: true,// 如果接口跨域,需要进行这个参数配置
pathRewrite: { //pathRewrite方法重写url
'^/api': '/',
},
// secure: false, // 如果要验证SSL证书 设置为true
// ws: true, // 如果您想代理websocket
},
},
// mock 使用需要打开
// before: require('./mock/mock-server.js')
},
二、vue.config.js中配置webpack
1、configureWebpack
调整 webpack 配置最简单的方式就是在 vue.config.js
中的 configureWebpack
选项提供一个对象:
该对象将会被 webpack-merge 合并入最终的 webpack 配置。
configureWebpack: {
// 以便在webpack的名称字段中提供应用程序的标题,以便
//可以在index.html中访问它以注入正确的标题。
name: name,
resolve: {
alias: {
"@": resolve("src"),
},
},
},
如果你需要基于环境有条件地配置行为,或者想要直接修改配置,那就换成一个函数 (该函数会在环境变量被设置之后懒执行)。该方法的第一个参数会收到已经解析好的配置。在函数内,你可以直接修改配置,或者返回一个将会被合并的对象:
configureWebpack: config => {
if (process.env.NODE_ENV === 'production') {
// 为生产环境修改配置...
} else {
// 为开发环境修改配置...
}
}
2、chainWebpack链式操作 (高级)
Vue CLI 内部的 webpack 配置是通过 webpack-chain 维护的。这个库提供了一个 webpack 原始配置的上层抽象,使其可以定义具名的 loader 规则和具名插件,并有机会在后期进入这些规则并对它们的选项进行修改。
chainWebpack(config) {
// it can improve the speed of the first screen, it is recommended to turn on preload
config.plugin("preload").tap(() => [
{
rel: "preload",
// to ignore runtime.js
// https://github.com/vuejs/vue-cli/blob/dev/packages/@vue/cli-service/lib/config/app.js#L171
fileBlacklist: [/\.map$/, /hot-update\.js$/, /runtime\..*\.js$/],
include: "initial",
},
]);
// when there are many pages, it will cause too many meaningless requests
config.plugins.delete("prefetch");
// set svg-sprite-loader
config.module.rule("svg").exclude.add(resolve("src/icons")).end();
config.module
.rule("icons")
.test(/\.svg$/)
.include.add(resolve("src/icons"))
.end()
.use("svg-sprite-loader")
.loader("svg-sprite-loader")
.options({
symbolId: "icon-[name]",
})
.end();
// set preserveWhitespace
config.module
.rule("vue")
.use("vue-loader")
.loader("vue-loader")
.tap((options) => {
options.compilerOptions.preserveWhitespace = true;
return options;
})
.end();
config.when(process.env.NODE_ENV == "development", (config) => {
config
.plugin("ScriptExtHtmlWebpackPlugin")
.after("html")
.use("script-ext-html-webpack-plugin", [
{
// `runtime` must same as runtimeChunk name. default is `runtime`
inline: /runtime\..*\.js$/,
},
])
.end();
config.optimization.splitChunks({
chunks: "all",
cacheGroups: {
libs: {
name: "chunk-libs",
test: /[\\/]node_modules[\\/]/,
priority: 10,
chunks: "initial", // only package third parties that are initially dependent
},
elementUI: {
name: "chunk-elementUI", // split elementUI into a single package
priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
test: /[\\/]node_modules[\\/]_?element-ui(.*)/, // in order to adapt to cnpm
},
commons: {
name: "chunk-commons",
test: resolve("src/components"), // can customize your rules
minChunks: 3, // minimum common number
priority: 5,
reuseExistingChunk: true,
},
},
});
// https:// webpack.js.org/configuration/optimization/#optimizationruntimechunk
config.optimization.runtimeChunk("single");
});
},
注意:
chainWebpack通过链式编程的形式,来修改默认的webpack配置
configureWebpack通过操作对象的形式,来修改默认的webpack配置
如果对一个loader或plugin修改的配置如果是一项的话推荐 chainWebpack、如果是多项的话用configureWebpack直接覆写