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'

注意:configureWebpackchainWebpack是互斥的,只能存在其中一个。

通过configureWebpack配置代码混淆

在更早之前我们通常使用的是uglifyjs-webpack-plugin插件来进行代码压缩和混淆,但是可能会出现一些问题,因为它已经很久没有更新了,而且它的实现方式是使用UglifyJS,而非现代化的Terser压缩器。

因此,更推荐使用 TerserPlugin 来进行代码压缩,这是一个现代化的JS压缩器,而且它是由Webpack官方推荐的压缩器。

以下是在Vue项目中使用 TerserPlugin 进行代码压缩的完整实例:

  1. 安装依赖

在命令行中运行以下命令来安装 TerserPlugin 插件:

npm install terser-webpack-plugin --save-dev
  1. 配置代码混淆

在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 插件