vue-cli中webpack-chain的链式操做我的理解(解决90%的疑问)

若是你看完了全文,请注意最后一句话html

  • 命令 vue inspect > webpack.test.js 将配置文件导出并保存到webpack.test.js文件 根据不少相关文章中的例子 vue inspect plugins 命令能够单独查看plugins的配置。 想查看其余配置怎么办呢??

假如生成的webpack文档以下vue

//vue inspect 生成的webpack文件内容
{
  mode: 'development',
  context: 'D:\\workspace\\my_vue\\demo',
  devtool: 'source-map',
  node: {
    setImmediate: false,
    process: 'mock',
    dgram: 'empty',
    fs: 'empty',
    net: 'empty',
    tls: 'empty',
    child_process: 'empty'
  },
  ...
}
复制代码

实际测试了下
查看mode 执行 vue inspect mode
查看node 下的 child_process配置 执行 vue inspect node.child_process
所以咱们能够推断出 想要查看rules的配置 执行 vue inspect module.rules
node

以后我在文档中找到了对应的说明 审查项目的-webpack-配置webpack

  • 常常看到的链式操做的例子
const merge = require('webpack-merge')
module.exports = {
      productionSourceMap: true,
      publicPath: 'vue',
      chainWebpack: config => {
        config.devtool('source-map')
        config.module
          .rule('images')
          .use('url-loader')
          .tap(options => // tap修改参数的方法
            merge(options, { //merge方法是保证咱们不会覆盖掉原有的其余配置
              limit: '1120'
            })
          )
      }
}
复制代码

一开始看到的时候并不能理解,一样咱们看下实际生成的内容git

{ 
  devtool:'source-map',
  ...
  module: {
    noParse: /^(vue|vue-router|vuex|vuex-router-sync)$/,
    rules: [     
        ...
        /* config.module.rule('images') */
        {
          test: /\.(png|jpe?g|gif|webp)(\?.*)?$/,
          use: [
          /* config.module.rule('images').use('url-loader') */
          {
            loader: 'url-loader',
            options: {
              limit: '1120',
              fallback: {
                loader: 'file-loader',
                options: {
                  name: 'img/[name].[hash:8].[ext]'
                }
              }
            }
          }
          ...
          ]
        }
    ]
  }
  ...
}
复制代码

这么看起来豁然开朗,生成webpack的配置中就有了一些说明。
同时咱们还能发现,github

  • 配置的json数据中的第一层即便方法的名字,配置的值就是方法的参数。
  • 若是该配置为一个对象里面有子配置,则执行完该配置的方法后,供链式配置的上下文会进到子配置里面,此时在使用子配置项作为方法名继续配置。
  • 使用end()方法能够返回一级。

虽然大部分均可以像总结的那样配置然而有些仍是有差异的。好比原配置是数组的rules。这只是一种速记方法web

如今咱们来继续配置修改rule(media)的配置vue-router

const merge = require('webpack-merge')
module.exports = {
  productionSourceMap: true,
  publicPath: 'vue',
  chainWebpack: config => {
    config.devtool('source-map')
    config.module
      .rule('images')
      .use('url-loader')
      .tap(options =>
        merge(options, {
          limit: '1120'
        })
      )
      .end() //返回到loader配置这一层
      .end() //返回到rules配置这一层
      .rule('media')//配置新的rule
      .use('url-loader')
      .tap(options =>
        merge(options, {
          limit: '1120'
        })
      )
  }
}

复制代码

这只是我我的的理解,但愿能够帮助其余朋友,然而这是根据结果推断的,所以会与实际的文档会有不少不一样,能够当成辅助记忆的一种方法。开发的过程当中,应当与 webpack-chain官方文档为主。配置完经过vue inspect确认配置,若是失效再去文档中寻找正确的配置方法。vuex

相关文章
相关标签/搜索