您现在的位置是:网站首页> 编程资料编程资料
vue.config.js中configureWebpack与chainWebpack区别及说明_vue.js_
2023-05-24
335人已围观
简介 vue.config.js中configureWebpack与chainWebpack区别及说明_vue.js_
configureWebpack与chainWebpack区别
configureWebpack与chainWebpack的作用相同,唯一的区别就是他们修改webpack配置方式不同:
https://cli.vuejs.org/zh/config/#configurewebpack

configureWebpack 通过操作对象得形式来修改迷人得webpack配置,该对象将会呗webpack-merge合并入最终得webpack配置
chainWebpack 通过链式编程的形式来修改默认的webpack配置
1.configureWebpack
1.1configureWebpack对象形式
configureWebpack: { resolve: { // 别名配置 alias: { 'assets': '@/assets', 'common': '@/common', 'components': '@/components' } } }1.2configureWebpack函数形式
const path = require('path'); function resolve(dir) { return path.join(__dirname,dir) } module.exports = { devServer: { ... }, lintOnSave:false, // eslint-loader 是否在保存时候检查代码 productionSourceMap: false, // 生产环境是否生成sourceMap 文件 filenameHashing: true, // 文件hash configureWebpack: config => { if(process.env.NODE_ENV === 'production') { ... }else { ... } // 直接修改配置 config.resolve.alias['assets'] = resolve('src/assets') } }或者
configureWebpack: config => { if(process.env.NODE_ENV){ ... }else{ ... } // 返回一个将要合并得对象 return { resolve: { alias: { '@asset': resolve("src/assets") } } } }2.chainWebpack
修改Loader选项
module.exports = { chainWebpack: config => { config.module .rule('vue') .use('vue-loader') .tap(options => { // 修改他的选项 return options }) } }添加一个新的Loader
module.exports = { chainWebpack: config => { 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') } }vue-cli中chainWebpack和configureWebpack
我们目前做的是国外的项目,考虑到东南亚浏览器版本低,所以公司采用了vue-cli2来搭建项目。
vue.config.js
- configureWebpack可以是对象,也可以是函数
- chainWebpack 可以是对象也可以是函数
当我们不知道config中有哪些属性或者方法的时候我们就可以采取函数的方式打印config然后再尝试这如何配置
函数 打印config
打印 configureWebpack中的config
const path = require('path') const resolve = (dir) => path.join(__dirname, dir) module.exports = { publicPath: './', runtimeCompiler: true, configureWebpack: (config) => { console.log(config) }, }config结果为
mode: 'production', context: 'C:\\Users\\shiyang.xue\\Desktop\\sems-pc', devtool: false, node: { setImmediate: false, process: 'mock', dgram: 'empty', fs: 'empty', net: 'empty', tls: 'empty', child_process: 'empty' }, output: { path: 'C:\\Users\\shiyang.xue\\Desktop\\sems-pc\\dist', filename: 'js/[name].[contenthash:8].js', publicPath: '', chunkFilename: 'js/[name].[contenthash:8].js' }, resolve: { alias: { '@': 'C:\\Users\\shiyang.xue\\Desktop\\sems-pc\\src', //别名 'vue$': 'vue/dist/vue.esm.js' }, extensions: [ '.mjs', '.js', '.jsx', '.vue', '.json', '.wasm' ],// vue解析时候查找文件的顺序 modules: [ // modules包的文件位置 'node_modules', 'C:\\Users\\shiyang.xue\\Desktop\\sems-pc\\node_modules', 'C:\\Users\\shiyang.xue\\Desktop\\sems-pc\\node_modules\\@vue\\cli-service\\node_modules' ], plugins: [ [Object] ] }, resolveLoader: { modules: [ // 这块就是modules的文件所在位置 ], plugins: [ [Object] ] }, module: { noParse: /^(vue|vue-router|vuex|vuex-router-sync)$/, rules: [ [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object] ] }, optimization: { splitChunks: { cacheGroups: [Object] }, minimizer: [ [TerserPlugin] ] }, plugins: [ VueLoaderPlugin {}, DefinePlugin { definitions: [Object] }, CaseSensitivePathsPlugin { options: {}, logger: [Object [console]], pathCache: Map(0) {}, fsOperations: 0, primed: false }, FriendlyErrorsWebpackPlugin { compilationSuccessInfo: {}, onErrors: undefined, shouldClearConsole: true, formatters: [Array], transformers: [Array], previousEndTimes: {} }, MiniCssExtractPlugin { options: [Object] }, OptimizeCssnanoPlugin { options: [Object] }, HashedModuleIdsPlugin { options: [Object] }, NamedChunksPlugin { nameResolver: [Function (anonymous)] }, HtmlWebpackPlugin { options: [Object] }, PreloadPlugin { options: [Object] }, PreloadPlugin { options: [Object] }, CopyPlugin { patterns: [Array], options: {} } ], entry: { app: [ './src/main.js' ] } }有了以上的信息,你就知道如何配置了,config信息中没有发现performance这个属性但是你利用对象的处理方式就可以。
configureWebpack: { performance: { hints: 'error', // 枚举 maxAssetSize: 30000000, // 整数类型(以字节为单位) // 单个文件大小超出就提示 maxEntrypointSize: 500000000, // 整数类型(以字节为单位) // 入口文件大小超出设定的值 就提示 assetFilter: function (assetFilename) { // 提供资源文件名的断言函数 return assetFilename.endsWith('.css') || assetFilename.endsWith('.js') } }, },这个和 vue-cli解析webpack的方式有关系,对象的方式解析的时候直接就取webpack原始的配置项目,然后再进行更新,而函数的方式只暴露一些常用的必须的方法或者属性,个人理解。
chainWebpack 函数式
const path = require('path') const resolve = (dir) => path.join(__dirname, dir) module.exports = { publicPath: './', runtimeCompiler: true, chainWebpack : (config) => { console.log(config) }, }config打印
parent: undefined, store: Map(3) { 'mode' => 'production', 'context' => 'C:\\Users\\shiyang.xue\\Desktop\\sems-pc', 'devtool' => false }, devServer: { parent: [Circular *1], store: Map(0) {}, allowedHosts: { parent: [Circular *2], store: Set(0) {} }, shorthands: [ 'after', 'before', 'bonjour', 'clientLogLevel', 'color', 'compress', 'contentBase', 'disableHostCheck', 'filename', 'headers', 'historyApiFallback', 'host', 'hot', 'hotOnly', 'http2', 'https', 'index', 'info', 'inline', 'lazy', 'mimeTypes', 'noInfo', 'open', 'openPage', 'overlay', 'pfx', 'pfxPassphrase', 'port', 'proxy', 'progress', 'public', 'publicPath', 'quiet', 'setup', 'socket', 'sockHost', 'sockPath', 'sockPort', 'staticOptions', 'stats', 'stdin', 'useLocalIp', 'watchContentBase', 'watchOptions', 'writeToDisk' ], after: [Function (anonymous)], before: [Function (anonymous)], bonjour: [Function (anonymous)], clientLogLevel: [Function (anonymous)], color: [Function (anonymous)], compress: [Function (anonymous)], contentBase: [Function (anonymous)], disableHostCheck: [Function (anonymous)], filename: [Function (anonymous)], headers: [Function (anonymous)], historyApiFallback: [Function (anonymous)], host: [Function (anonymous)], hot: [Function (anonymous)], hotOnly: [Function (anonymous)], http2: [Function (anonymous)], https: [Function (anonymous)], index: [Function (anonymous)], info: [Function (anonymous)], inline: [Function (anonymous)], lazy: [Function (anonymous)], mimeTypes: [Function (anonymous)], noInfo: [Function (anonymous)], open: [Function (anonymous)], openPage: [Function (anonymous)], overlay: [Function (anonymous)], pfx: [Function (anonymous)], pfxPassphrase: [Function (anonymous)], port: [Function (anonymous)], proxy: [Function (anonymous)], progress: [Function (anonymous)], public: [Function (anonymous)], publicPath: [Function (anonymous)], quiet: [Function (anonymous)], setup: [Function (anonymous)], socket: [Function (anonymous)], sockHost: [Function (anonymous)], sockPath: [Function (anonymous)], sockPort: [Function (anonymous)], staticOptions: [Function (anonymous)], stats: [Function (anonymous)], stdin: [Function (anonymous)], useLocalIp: [Function (anonymous)], watchContentBase: [Function (anonymous)], watchOptions: [Function (anonymous)], writeToDisk: [Function (anonymous)] }, entryPoints: { parent: [Circular *1], store: Map(1) { 'app' => [Object] } }, module: { parent: [Circular *1], store: Map(1) { 'noParse' => /^(vue|vue-router|vuex|vuex-router-sync)$/ }, rules: { parent: [Circular *3], store: [Map] }, defaultRules: { parent: [Circular *3], store: Map(0) {} }, shorthands: [ 'noParse', 'strictExportPresence' ], noParse: [Function (anonymous)], strictExportPresence: [Function (anonymous)] }, node: { parent: [Circular *1], store: Map(7) { 'setImmediate
相关内容
- vue3如何使用eventBus订阅发布模式_vue.js_
- vue-cli4如何打包静态资源到指定目录_vue.js_
- Vxe-Table开发中的各种坑以及避坑指南_vue.js_
- 如何使用npm安装yarn详解_node.js_
- vue3项目中引入ts的详细图文教程_vue.js_
- vue项目中图片选择路径位置static或assets的区别及说明_vue.js_
- vue-cli中的图片资源存放位置详解_vue.js_
- vue-cli项目中img如何使用require动态获取图片_vue.js_
- 微信小程序嵌入H5页面(web-view)的方法详解_javascript技巧_
- lodash内部方法getFuncName及setToString剖析详解_JavaScript_
点击排行
本栏推荐
