### 一、环境及依赖配置 #### 1.1、环境要求 Node版本要在10.13.0以上1444 #### 1.2、基础依赖 ``` -- 安装webpack所需依赖 npm i webpack webpack-cli webpack-dev-server --save -- 安装自动生成html依赖 npm i html-webpack-plugin html-loader clean-webpack-plugin --save-dev -- 安装css/字体图表处理依赖 npm i css-loader style-loader sass sass-loader mini-css-extract-plugin --save -- 如果有scss则还需引入 npm i sass sass-loader --save -- 如果有less则还需引入 npm i less less-loader --save -- 为不同内核的浏览器加上CSS前缀 npm install postcss-loader autoprefixer --save -- 图片及字体处理 npm i url-loader file-loader --save -- 合并配置 npm i webpack-merge --save-dev ``` 说明:这里只是一些基础依赖,如果有其他优化调整额外需要引入依赖的话,需要查看一下是否与webpack5是否兼容。 ### 二、配置 #### 2.1、通用配置webpack.base.js ```const path = require('path') const HtmlWebpackPlugin = require('html-webpack-plugin') const MiniCssPlugin = require('mini-css-extract-plugin') const VueLoaderPlugin = require('vue-loader/lib/plugin') const webpack = require('webpack') const name = 'ecrm-front' module.exports = { // 使用回调函数。或者直接返回对象。 optimization: { nodeEnv: false }, target: 'web', entry: path.resolve(__dirname, './src/main.js'), output: { crossOriginLoading: 'anonymous', path: path.resolve(__dirname, 'dist'), publicPath: `/${name}`, library: `${name}-[name]`, libraryTarget: 'umd', chunkLoadingGlobal: `webpackJson_${name}`, filename: 'js/[name]_[hash:8].js', clean: true }, plugins: [ new HtmlWebpackPlugin({ template: './public/index.html', publicPath: `/${name}/` }), new MiniCssPlugin({ filename: 'css/bundle.css' }), new VueLoaderPlugin(), new webpack.ProvidePlugin({ Path: ['path'], process: 'process/browser' }) ], module: { rules: [ { test: /\.vue$/, loader: 'vue-loader' }, { test: /\.js$/, loader: 'babel-loader', exclude: /node_module/ }, { test: /\.css$/, use: [MiniCssPlugin.loader, 'css-loader', 'postcss-loader'] }, { test: /\.scss$/, use: [ { loader: MiniCssPlugin.loader, options: { publicPath: '..' } }, 'css-loader', 'postcss-loader', 'sass-loader' ], generator: { filename: './scss/[name]_[hash].[ext]' } }, { test: /\.svg$/, loader: 'svg-sprite-loader', include: [path.resolve(__dirname, 'src/assets/icons/svg')], options: { symbolId: 'icon-[name]' } }, { test: /\.jpg$/, type: 'asset', parser: { dataUrlCondition: { maxSize: 4 * 1024 * 1024 // 4M } } }, { test: /\.gif$/, type: 'asset', parser: { dataUrlCondition: { maxSize: 4 * 1024 * 1024 // 4M } } }, { test: /\.png$/, type: 'asset/resource', // 打包后的静态资源位置 及 文件名 // generator: { // filename: './image/[hash].[ext]' // }, parser: { dataUrlCondition: { maxSize: 1024 * 1024 } } }, { test: /\.html$/, loader: 'html-loader' }, { test: /\.wav$/, loader: 'url-loader', options: { name: 'audios/[name].[ext]', limit: 10 } } ] }, resolve: { // https://github.com/babel/babel/issues/8462 // https://blog.csdn.net/qq_39807732/article/details/110089893 // 如果确认需要node polyfill,设置resolve.fallback安装对应的依赖 // webpack5 关闭node功能 要自己导入 fallback: { }, alias: { '@': path.resolve(__dirname, './src') }, extensions: ['.json', '.js', '.vue'] }, // 关闭性能提示 performance: { hints: false } } ``` #### 2.2、出口配置文件,例如webpack.gray.js ``` const { merge } = require('webpack-merge') const path = require('path') const webpack = require('webpack') const baseConfig = require('./webpack.base.js') const name = 'ecrm-front' const grayConfig = { // 使用回调函数。或者直接返回对象。 mode: 'production', devServer: { open: false, port: 80, hot: true, static: path.resolve(__dirname, 'dist') // 网站的根目录为 根目录/dist,如果配置不对,会报Cannot GET /错误 }, plugins: [ new webpack.DefinePlugin({ 'process.env': { // 定义环境和变量 NODE_ENV: JSON.stringify('production'), VUE_APP_CURRENTMODE: JSON.stringify('gray'), // 访问地址 VUE_APP_ROOTURL: JSON.stringify(`http://192.168.21.31/${name}`), // CRM web接口前缀 VUE_APP_CTX: JSON.stringify('http://192.168.21.31/ecrm-web'), // 系统管理接口前缀 VUE_APP_SSOURL: JSON.stringify('http://192.168.21.31/usm-api'), // 报表地址前缀 VUE_APP_REPORTURL: JSON.stringify('http://app.vazyme.cn/fms-report'), // BI地址前缀 VUE_APP_BIURL: JSON.stringify('https://app.vazyme.cn/fms-finebi'), // CRM render接口前缀 VUE_APP_CRMRENDERURL: JSON.stringify('http://192.168.21.31/ecrm-render'), // 附件上传接口前缀 VUE_APP_FILEURL: JSON.stringify('http://192.168.21.31/doc-cloud-oss'), // CRM follow接口前置 VUE_APP_COMPLIANCEURL: JSON.stringify('http://192.168.21.31/ecrm-follow'), // CRM visit接口前缀 VUE_APP_VISIT_CTX: JSON.stringify('http://192.168.21.31/ecrm-visit'), // CRM export接口前缀 VUE_APP_EXPORT_CTX: JSON.stringify('http://192.168.21.31/ecrm-export'), // CRM 移动端访问地址 VUE_APP_ROOTURL_MOBILE: JSON.stringify('http://192.168.21.31/ecrm-mfront/'), // CRM 打印工程接口前置 VUE_APP_PRINT: JSON.stringify('http://192.168.21.31/ecrm-print'), // 网关注销接口 VUE_APP_GATEWAYURL: JSON.stringify('http://192.168.21.31/sso-service'), // 基座应用 MAIN_ROOT: JSON.stringify('http://192.168.21.31/home') } }) ] } module.exports = merge(baseConfig, grayConfig) ``` 其他还有什么优化配置的可以去webpack中文网站了解一下:[https://webpack.docschina.org/concepts/](https://webpack.docschina.org/concepts/)