Vue-CLI(vue.config.js)详细配置
Vue和Vue CLI的关系
Vue和Vue CLI是密切相关的两个概念,它们分别代表了Vue.js框架和Vue.js脚手架工具。简单来说,Vue是一个前端JavaScript框架,而Vue CLI则是一个基于命令行的脚手架工具,用于快速搭建Vue项目。
什么是Vue.js
具体来说,Vue.js是一个轻量级、渐进式的JavaScript框架,它专注于构建用户界面,提供了诸如数据绑定、组件化、响应式等特性,使开发者可以更加高效地构建现代化的Web应用程序。Vue.js本身并不包含用于构建应用程序的工具,因此在实际项目中,你需要使用一些辅助工具(如Webpack、Babel、ESLint等)来协助构建和管理Vue应用程序。
什么是Vue CLI
Vue CLI则是一个官方提供的脚手架工具,它通过简单的命令行操作,可以快速搭建和配置一个Vue项目的基础结构,包括Webpack配置、Babel配置、ESLint配置等。除此之外,Vue CLI还提供了一些有用的插件和工具,例如Vue Router、Vuex、axios等,可以让你更加高效地进行开发和调试。需要注意的是,Vue CLI要求使用Node.js版本不低于8.9。
因此,Vue和Vue CLI是两个紧密相关的概念,Vue提供了构建Web应用程序所需的核心框架和特性,而Vue CLI则提供了搭建和管理Vue项目所需的脚手架和工具。在实际开发中,通常使用Vue CLI来快速搭建和管理Vue项目,同时使用Vue.js来构建Web应用程序的核心功能。
Vue.config.js配置
vue.config.js 是 Vue CLI 项目的配置文件,它使用了 Node.js 导出模块的语法。在该文件中,可以配置项目的一些构建和开发配置选项,如配置 webpack、自定义打包路径、代理、开发服务器等等。当 Vue CLI 执行构建或启动服务时,它会自动读取并应用 vue.config.js 中的配置。通过修改 vue.config.js 可以定制化 Vue CLI 生成的项目。
Webpack 相关配置
| 属性名 | 类型 | 作用 | 示例 |
|---|---|---|---|
| publicPath | string | 打包后的资源访问路径 | “/dist/” |
| outputDir | string | 打包后的输出目录 | “dist” |
| assetsDir | string | 放置生成的静态资源 (相对于 outputDir) | “assets” |
| indexPath | string | 指定生成的 index.html 文件名 | “index.html” |
| filenameHashing | boolean | 文件名是否包含 hash 值 | true |
| pages | Object | 多页面应用配置 | { index: { entry: ‘src/index/main.js’, template: ‘public/index.html’, filename: ‘index.html’ }, … } |
| lintOnSave | boolean/string | 是否在开发环境下通过 eslint-loader 在每次保存时 lint 代码 | “warning” |
| transpileDependencies | Array |
默认情况下 babel-loader 会忽略所有 node_modules 中的文件。 如果你想要通过 Babel 显式转译一个依赖,可以在这个选项中列出来 | [“my-dep”, “another-dep”] |
| configureWebpack | Object/function | 修改 webpack 配置 | { devtool: ‘source-map’, plugins: [new MyAwesomeWebpackPlugin()] } 或 module.exports = { configureWebpack: { devtool: ‘source-map’, plugins: [new MyAwesomeWebpackPlugin()] } } |
| chainWebpack | function | 修改 webpack 链式配置 | module.exports = { chainWebpack: config => { config.module.rule(‘eslint’).use(‘eslint-loader’).options({ fix: true }) } } |
开发服务器相关配置
| 属性名 | 类型 | 作用 | 示例 |
|---|---|---|---|
| devServer.host | string | 指定使用一个 host。默认是 localhost。如果你希望服务器外部可访问,指定为 0.0.0.0。 | ‘0.0.0.0’ |
| devServer.port | number | 端口号 | 8080 |
| devServer.https | boolean | Object | 是否使用 HTTPS 协议。值为对象时,会被传给 https.createServer()。 |
true |
| devServer.proxy | string | Object | 配置开发服务器的代理。 | module.exports = { devServer: { proxy: { ‘/api’: { target: ‘http://api.example.com’, changeOrigin: true, pathRewrite: { ‘^/api’: ‘’ } } } } } |
| devServer.open | boolean | string | 是否自动打开浏览器。 | true |
| devServer.hot | boolean | 启用热更新。 | true |
| devServer.hotOnly | boolean | 只使用热更新。在没有浏览器刷新的情况下启用热模块替换(HMR)。 | true |
| devServer.watchOptions | Object | 监听文件变化的选项。 | |
| devServer.headers | Object | 在所有响应中添加首部内容。 | |
| devServer.historyApiFallback | boolean | Object | 当使用 HTML5 History API 时,任意的 404 响应可以提供为 index.html 页面。对象的属性将被传递到 connect-history-api-fallback中。 | true |
| devServer.overlay | boolean | Object | 在浏览器中显示错误覆盖层。 | |
| devServer.compress | boolean | 启用 gzip 压缩。 | true |
CSS相关配置
| 属性名 | 类型 | 作用 | 默认值 | 示例 |
|---|---|---|---|---|
| css.requireModuleExtension | Boolean | 启用/禁用 CSS 模块和 @import 引入的 URL 不写文件扩展名时的警告。 | true | css: { requireModuleExtension: true } |
| css.extract | Boolean/Object | 是否使用css分离插件 | 生产环境下是 true,开发环境下是 false | css: { extract: true } 或 css: { extract: { ignoreOrder: true } } |
| css.sourceMap | Boolean | 是否开启 CSS source map。 | false | css: { sourceMap: true } |
| css.loaderOptions | Object | 向 CSS 相关的 loader 传递选项。 | {} |
css: { loaderOptions: { css: { /* css-loader */ }, postcss: { /* postcss-loader */ } } } |
| css.modules | Boolean | 是否开启 CSS modules for all css / pre-processor files. | false | css: { modules: true } |
| css.requireModuleExtension | Boolean | 启用/禁用 CSS 模块和 @import 引入的 URL 不写文件扩展名时的警告。 | true | css: { requireModuleExtension: true } |
请注意,这里的配置信息可能会因为版本更新而发生变化,建议查看官方文档以获得最新信息。
插件相关配置
| 属性名 | 类型 | 作用 | 示例 |
|---|---|---|---|
pluginOptions |
Object | 传递给webpack的插件选项 | { foo: 'bar' } |
configureWebpack |
Object/Function | 自定义webpack配置 | { optimization: { splitChunks: false } } |
chainWebpack |
Function | 通过链式调用API扩展或修改webpack配置 | (config) => { config.module.rule('vue').use('vue-loader').tap(options => { return options }) } |
css |
Object | css预设选项 | { requireModuleExtension: true, loaderOptions: {}} |
lintOnSave |
Boolean/String | 是否在保存时lint代码 | true, 'error', 'warning' |
productionSourceMap |
Boolean | 是否生成生产环境的source map | false |
transpileDependencies |
Array/String | Babel显式转译依赖的包 | ['my-dep'], 'my-dep' |
注意:configureWebpack和chainWebpack是互斥的,只能存在其中一个。
通过configureWebpack配置代码混淆
在更早之前我们通常使用的是uglifyjs-webpack-plugin插件来进行代码压缩和混淆,但是可能会出现一些问题,因为它已经很久没有更新了,而且它的实现方式是使用UglifyJS,而非现代化的Terser压缩器。
因此,更推荐使用 TerserPlugin 来进行代码压缩,这是一个现代化的JS压缩器,而且它是由Webpack官方推荐的压缩器。
以下是在Vue项目中使用 TerserPlugin 进行代码压缩的完整实例:
- 安装依赖
在命令行中运行以下命令来安装 TerserPlugin 插件:
npm install terser-webpack-plugin --save-dev
- 配置代码混淆
在Vue项目的根目录下的 vue.config.js 文件中添加以下代码来配置代码混淆:
const TerserPlugin = require('terser-webpack-plugin');
module.exports = {
configureWebpack: {
optimization: {
minimizer: [
new TerserPlugin({
terserOptions: {
compress: {
warnings: false,
drop_console: true,
drop_debugger: true,
pure_funcs: ['console.log'] // 移除console.log语句
}
}
})
]
}
}
}
在这个例子中,我们引入了 TerserPlugin 插件,并在 configureWebpack 选项中的 optimization 属性下添加了一个 minimizer 数组,它包含了我们要使用的 TerserPlugin 插件的实例。
TerserPlugin 有一些配置选项,这里我们使用 terserOptions 属性来指定压缩选项,它的 compress 属性用于指定要启用的压缩选项,例如移除警告、console.log语句和debugger语句等。
其他配置
| 属性名 | 类型 | 作用 | 默认值 | 示例 |
|---|---|---|---|---|
productionSourceMap |
Boolean |
是否为生产环境构建生成 source map 文件 | true |
false |
crossorigin |
String |
设置 <link> 和 <script> 标签的 crossorigin 属性 |
无 | 'anonymous' |
integrity |
Boolean |
String |
是否为 <link> 和 <script> 标签启用 Subresource Integrity (SRI) 校验 |
false |
chainWebpack |
Function |
在内部的 webpack 配置中的「链式操作」(cli-service内部使用的webpack链式操作API) 增加或修改 Loader | 无 | js module.exports = { chainWebpack: config => { config.module .rule('eslint') .use('eslint-loader') .options({ fix: true }) .end() } } |
configureWebpack |
Object |
Function |
在内部的 webpack 配置中进行修改(直接修改webpack config) | 无 |
parallel |
Boolean |
Number |
启用多线程并行构建 | require('os').cpus().length > 1 |
pwa |
Object |
undefined |
配置 PWA 插件 | 无 |