构建

本文共--字 阅读约--分钟 | 浏览: -- Last Updated: 2021-06-25

webpack 相关

configureWebpack

调整 webpack 配置最简单的方式就是在 vue.config.js 中的 configureWebpack 返回一个函数或者返回一个将会被合并的对象。

// vue.config.js
module.exports = {
  configureWebpack: {
    plugins: [
      new MyAwesomeWebpackPlugin()
    ]
  }
}

// 需要注意的是 output.path、 output.publicPath 不能配置在 configWebpack 中
// 而是应该直接配置在 `vue.config.js` 的对应选项 outputDir 、 publicPath 中
// 因为这些值在多个地方被使用,为了确保正常工作,应该统一起来

chainWebpack (链式操作)

Vue CLI 内部的 webpack 配置还有一个 chainWebpack 是通过 webpack-chain 维护的。这个库提供了一个 webpack 原始配置的上层抽象,使其可以定义具名的 loader 规则和具名插件,并有机会在后期进入这些规则并对它们的选项进行修改。它允许我们更细粒度的控制其内部配置.

示例:

// vue.config.js
module.exports = {
  chainWebpack: config => {
    // 修改 Loader 选项
    config.module
      .rule('vue')
      .use('vue-loader')
        .loader('vue-loader')
        .tap(options => {
          // 修改它的选项...
          return options
        });
  
    // 添加一个新的 Loader
    config.module
      .rule('graphql')
      .test(/\.graphql$/)
      .use('graphql-tag/loader')
        .loader('graphql-tag/loader')
        .end()
      .use('other-loader') // 添加
        .loader('other-loader')
        .end();
    
    // 替换一个规则里的 Loader
    const svgRule = config.module.rule('svg')

    // 清除已有的所有 loader。
    // 如果你不这样做,接下来的 loader 会附加在该规则现有的 loader 之后。
    svgRule.uses.clear()

    // 添加要替换的 loader
    svgRule
      .use('vue-svg-loader')
        .loader('vue-svg-loader');
    
    // 修改插件选项
    // 将 index.html 默认的路径从 /Users/username/proj/public/index.html 改为 /Users/username/proj/app/templates/index.html
    config
      .plugin('html')
      .tap(args => {
        args[0].template = '/Users/username/proj/app/templates/index.html'
        return args;
      })
  }
}

// 这里只是举例,对于 CSS 相关 loader 来说,推荐使用上面提到的 css.loaderOptions 

审查项目的 webpack 配置

因为 @vue/cli-service 对 webpack 配置进行了抽象,所以理解配置中包含的东西会比较困难,尤其是当你打算自行对其调整的时候。vue-cli-service 暴露了 inspect 命令用于审查解析好的 webpack 配置。

那个全局的 vue 命令行同样提供了 inspect 命令,这个命令只是简单的把 vue-cli-service inspect 代理到了你的项目中。

该命令会将解析出来的 webpack 配置、包括链式访问规则和插件的提示打印到 stdout。

vue inspect > output.js

# 只审查第一条规则
vue inspect module.rules.0

# 或者指向一个规则或插件的名字
vue inspect --rule vue
vue inspect --plugin html

# 列出所有规则和插件的名字
vue inspect --rules
vue inspect --plugins  # 会有对应注释来提示如何在vue.config.js来修改对应插件

以一个文件的方式使用解析好的配置

有些外部工具可能需要通过一个文件访问解析好的 webpack 配置,比如那些需要提供 webpack 配置路径的 IDE 或 CLI。在这种情况下你可以使用如下路径 <projectRoot>/node_modules/@vue/cli-service/webpack.config.js,该文件会动态解析并输出 vue-cli-service 命令中使用的相同的 webpack 配置,包括那些来自插件甚至是你自定义的配置。

配置

vue.config.js 是一个可选的配置文件,如果项目的 (和 package.json 同级的) 根目录中存在这个文件,那么它会被 @vue/cli-service 自动加载。你也可以使用 package.json 中的 vue 字段,但是注意这种写法需要你严格遵照 JSON 的格式来写。

publicPath

部署应用包时的基本 URL。例如 https://www.my-app.com/my-app/,则设置 publicPath 为 /my-app/

这个值也可以被设置为空字符串 ('') 或是相对路径 ('./'),这样所有的资源都会被链接为相对路径,这样打出来的包可以被部署在任意路径。

outputDir

默认 'dist',当运行 vue-cli-service build 时生成的生产环境构建文件的目录。注意目标目录在构建之前会被清除 (构建时传入 –no-clean 可关闭该行为)。

pages

module.exports = {
  pages: {
    index: {
      // page 的入口
      entry: 'src/index/main.js',
      // 模板来源
      template: 'public/index.html',
      // 在 dist/index.html 的输出
      filename: 'index.html',
      // 当使用 title 选项时,
      // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>
      title: 'Index Page',
      // 在这个页面中包含的块,默认情况下会包含
      // 提取出来的通用 chunk 和 vendor chunk。
      chunks: ['chunk-vendors', 'chunk-common', 'index']
    },
    // 当使用只有入口的字符串格式时,
    // 模板会被推导为 `public/subpage.html`
    // 并且如果找不到的话,就回退到 `public/index.html`。
    // 输出文件名会被推导为 `subpage.html`。
    subpage: 'src/subpage/main.js'
  }
  // 每个“page”应该有一个对应的 JavaScript 入口文件。其值应该是一个对象,对象的 key 是入口的名字,比如这里的 index subpage
}

更多配置请查看配置参考