在vue.config.js文件下配置webpack,其他的就不说了,主要是configureWebpack以及chainWebpack,两个在文件内是可以同时使用的。

configureWebpack:

调整 webpack 配置最简单的方式就是在 vue.config.js 中的 configureWebpack 选项提供一个对象,该对象将会被 webpack-merge 合并入最终的 webpack 配置。

module.exports = {

configureWebpack: {

plugins: [

new MyAwesomeWebpackPlugin()

]

}

}

如果你需要基于环境有条件地配置行为,或者想要直接修改配置,那就换成一个函数 (该函数会在环境变量被设置之后懒执行)。该方法的第一个参数会收到已经解析好的配置。在函数内,你可以直接修改配置,或者返回一个将会被合并的对象:

// vue.config.js

module.exports = {

configureWebpack: config => {

if (process.env.NODE_ENV === "production") {

// 为生产环境修改配置...

config.mode = "production";

// 这里修改下

config.optimization.minimizer = [

new UglifyJsPlugin({

uglifyOptions: {

compress: {

warnings: false,

drop_console: true, //console

drop_debugger: true,

pure_funcs: ['console.log'] //移除console

}

}

})

]

//打包文件大小配置

config["performance"] = {

"maxEntrypointSize":10000000,

"maxAssetSize":30000000

}

} else {

// 为开发环境修改配置...

config.mode = "development";

}

}

}

 chainWebpack:

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

它允许我们更细粒度的控制其内部配置。接下来有一些常见的在 vue.config.js 中的 chainWebpack 修改的例子。

//修改loader

module.exports = {

chainWebpack: config => {

config.module

.rule('vue')

.use('vue-loader')

.tap(options => {

// 修改它的选项...

return options

})

}

}

//添加一个新的 Loader

module.exports = {

chainWebpack: config => {

// GraphQL Loader

config.module

.rule('graphql')

.test(/\.graphql$/)

.use('graphql-tag/loader')

.loader('graphql-tag/loader')

.end()

// 你还可以再添加一个 loader

.use('other-loader')

.loader('other-loader')

.end()

}

}

//替换一个规则里的 Loader

module.exports = {

chainWebpack: config => {

const svgRule = config.module.rule('svg')

// 清除已有的所有 loader。

// 如果你不这样做,接下来的 loader 会附加在该规则现有的 loader 之后。

svgRule.uses.clear()

// 添加要替换的 loader

svgRule

.use('vue-svg-loader')

.loader('vue-svg-loader')

}

}

//修改插件选项

module.exports = {

chainWebpack: config => {

config

.plugin('html')

.tap(args => {

return [/* 传递给 html-webpack-plugin's 构造函数的新参数 */]

})

}

}

比方说你想要将 index.html 默认的路径从 /Users/username/proj/public/index.html 改为 /Users/username/proj/app/templates/index.html。通过参考 html-webpack-plugin 你能看到一个可以传入的选项列表。我们可以在下列配置中传入一个新的模板路径来改变它

// vue.config.js

module.exports = {

chainWebpack: config => {

config

.plugin('html')

.tap(args => {

args[0].template = '/Users/username/proj/app/templates/index.html'

return args

})

}

}

关于插件webpack-chain的使用方法:

// Require the webpack-chain module. This module exports a single

// constructor function for creating a configuration API.

const Config = require('webpack-chain');

// Instantiate the configuration with a new API

const config = new Config();

// Make configuration changes using the chain API.

// Every API call tracks a change to the stored configuration.

config

// Interact with entry points

.entry('index')

.add('src/index.js')

.end()

// Modify output settings

.output

.path('dist')

.filename('[name].bundle.js');

// Create named rules which can be modified later

config.module

.rule('lint')

.test(/\.js$/)

.pre()

.include

.add('src')

.end()

// Even create named uses (loaders)

.use('eslint')

.loader('eslint-loader')

.options({

rules: {

semi: 'off'

}

});

config.module

.rule('compile')

.test(/\.js$/)

.include

.add('src')

.add('test')

.end()

.use('babel')

.loader('babel-loader')

.options({

presets: [

['@babel/preset-env', { modules: false }]

]

});

// Create named plugins too!

config

.plugin('clean')

.use(CleanPlugin, [['dist'], { root: '/dir' }]);

// Export the completed configuration object to be consumed by webpack

module.exports = config.toConfig();

 

以上都是摘抄于文档,详细的webpack-chain见:GitHub - neutrinojs/webpack-chain: A chaining API to generate and simplify the modification of Webpack configurations.

下面说说 审查webpack的配置:

vue inspect //查看webpack全部配置

vue inspect --rules //查看webpack所有规则

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

vue inspect --rule vue //只查vue的loader

vue inspect --plugins

vue inspect --plugin html //检查html的插件

配置好以后可以自己审查 

 

相关文章

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。