build 文件夹中的 webpack.base.conf.js
1 // webpack.base.conf.js 基础配置 2 'use strict' 3 const path = require('path') // path模块是路径设置 4 const webpack = require('webpack') 5 const utils = require('./utils') // 主要处理css-loader 6 const config = require('../config') // 引入config目录下的index.js配置文件,主要定义一些开发和生产 7 const vueLoaderConfig = require('./vue-loader.conf') //解决css文件 8 const MiniCssExtractPlugin = require('mini-css-extract-plugin') // 从css文件中提取css代码到单独的文件中,对css代码进行代码压缩等 9 const VueLoaderPlugin = require('vue-loader/lib/plugin') 10 const threadLoader = require('thread-loader') // 多进程打包 11 const HardSourceWebpackPlugin = require('hard-source-webpack-plugin') // 缓存的方式 webpack5.0会把hard-source-webpack-plugin内置成一个配置。 12 const prodEnv = require('../config/prod.env') 13 14 const WorkerPool = { 15 workers: 2, 16 workerParallelJobs: 50, 17 poolTimeout: 2000, 18 poolRespawn: false, 19 name: "my-pool" 20 }; 21 22 threadLoader.warmup(WorkerPool, ['vue-loader', 'babel-loader']); 23 24 function resolve(dir) { 25 return path.join(__dirname, '..', dir) 26 } 27 28 // 加载 Eslint ,是否开启 取决于 config 目录下的 index.js 中的 useEslint 29 const createLintingRule = () => ({ 30 test: /\.(js|vue)$/, 31 loader: 'eslint-loader', 32 enforce: 'pre', 33 include: [resolve('src'), resolve('test')], 34 options: { 35 formatter: require('eslint-friendly-formatter'), 36 emitWarning: !config.dev.showEslintErrorsInOverlay 37 } 38 }) 39 40 41 // webpack 四个核心概念:入口(entry)、输出(output)、loader、插件(plugins) 42 43 44 // 将这个文件暴露出去 45 module.exports = { 46 context: path.resolve(__dirname, '../'), 47 48 /** 49 * 入口(entry) 50 * 入口起点(entry point)指示 webpack 应该使用哪个模块,来作为构建其内部依赖图的开始。entry的值可以是一个字符串也可以是一个数组(会将entry定义的数组文件内容打包到output中定义的文件中),也* 可以是一个json对象(使用于多页面的编译),默认值为 ./src 51 */ 52 entry: { 53 app: './src/main.js' 54 }, 55 56 /** 57 * 插件(plugins) 58 */ 59 plugins: [ 60 new VueLoaderPlugin(), 61 new HardSourceWebpackPlugin({ 62 // 缓存位置 63 cacheDirectory: process.env.NODE_ENV === 'development' || !prodEnv.VERSION_CONTROL ? '../node_modules/.cache/hard-source/[confighash]' : '../../node_modules/.cache/hard-source/[confighash]', 64 65 // 记录路径 66 recordsPath: process.env.NODE_ENV === 'development' || !prodEnv.VERSION_CONTROL ? '../node_modules/.cache/hard-source/[confighash]/records.json' : '../../node_modules/.cache/hard-source/[confighash]/records.json', 67 configHash: function (webpackConfig) { 68 // node-object-hash on npm can be used to build this. 69 return require('node-object-hash')({ 70 sort: false 71 }).hash(webpackConfig); 72 }, 73 74 // 当加载器,插件,其他构建时脚本或其他动态依赖项发生更改时,hard-source需要替换缓存以确保输 75 // 出正确。environmentHash被用来确定这一点。如果散列与先前的构建不同,则将使用新的缓存 76 environmentHash: { 77 root: process.cwd(), 78 directories: [], 79 files: ['package-lock.json', 'yarn.lock'], 80 } 81 }), 82 ...(function () { 83 let max = 2 84 let res = [] 85 for (let i = 0; i < max; i++) { 86 res.push(new webpack.DllReferencePlugin({ 87 context: path.resolve(__dirname, '../'), 88 manifest: require(resolve(`./dllManifest/xuAdmin${i}-manifest.json`)) 89 })) 90 } 91 return res 92 })() 93 ], 94 95 /** 96 * 输出(output) 97 * output 属性告诉 webpack 在哪里输出它所创建的 bundles,以及如何命名这些文件,默认值为 ./dist。 98 */ 99 output: { 100 path: config.build.assetsRoot, // 路径是config目录下的index.js中的build配置中的assetsRoot,也就是dist目录 101 filename: '[name].js', // 文件名称这里使用默认的name也就是main 102 103 // 上线地址,也就是真正的文件引用路径,如果是production生产环境,其实这里都是 '/' 104 publicPath: process.env.NODE_ENV === 'production' ? 105 config.build.assetsPublicPath : config.dev.assetsPublicPath 106 }, 107 108 109 /** 110 * 解析(resolve) 配置模块如何解析 111 */ 112 resolve: { 113 // resolve.extensions 自动解析确定的扩展。默认值为:extensions: [".js", ".json"] 114 extensions: ['.js', '.vue', '.json'], 115 116 // resolve.alias 创建 import 或 require 的别名,来确保模块引入变得更简单。 117 alias: { 118 'vue$': 'vue/dist/vue.esm.js', //后面的$符号指精确匹配,也就是说只能使用 import vuejs from "vue" 这样的方式导入vue.esm.js文件,不能在后面跟上 vue/vue.js 119 '@': resolve('src'), // // resolve('src') 其实在这里就是项目根目录中的src目录,使用 import somejs from "@/some.js" 就可以导入指定文件 120 } 121 }, 122 123 /** 124 * loader 125 * loader 让 webpack 能够去处理那些非 JavaScript 文件(webpack 自身只理解 JavaScript) 126 * 对一个单独的 module 对象定义了 rules 属性,里面包含两个必须属性:test 和 use 127 * 这告诉 webpack 编译器(compiler) 如下信息: 128 * “嘿,webpack 编译器,当你碰到「在 require()/import 语句中被解析为 '.vue' 的路径」时,在你对它打包之前,先使用 vue-loader 转换一下。 129 */ 130 module: { 131 rules: [{ 132 test: /\.vue$/, 133 use: [{ 134 loader: 'thread-loader', 135 options: WorkerPool 136 }, 137 'cache-loader', 138 { 139 loader: 'vue-loader', 140 options: vueLoaderConfig 141 } 142 ] 143 }, 144 { 145 test: /\.js$/, 146 use: [{ 147 loader: 'thread-loader', 148 options: WorkerPool 149 }, 150 'cache-loader', 151 { 152 loader: 'babel-loader', 153 options: { 154 cacheDirectory: true 155 } 156 } 157 ], 158 include: [resolve('src'), resolve('test')], 159 exclude: /(node_modules)/ 160 }, 161 { 162 test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, 163 loader: 'url-loader', 164 options: { 165 limit: 10000, 166 esModule: false, 167 name: utils.assetsPath('img/[name].[hash:7].[ext]') 168 }, 169 exclude: [resolve('src/icons')], 170 }, 171 { 172 test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, 173 loader: 'url-loader', 174 options: { 175 limit: 10000, 176 esModule: false, 177 name: utils.assetsPath('media/[name].[hash:7].[ext]') 178 } 179 }, 180 { 181 test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, 182 loader: 'url-loader', 183 options: { 184 limit: 10000, 185 esModule: false, 186 name: utils.assetsPath('fonts/[name].[hash:7].[ext]'), 187 publicPath: "../../" 188 } 189 }, 190 { 191 test: /\.sass$/, 192 use: [process.env.NODE_ENV === 'production' ? MiniCssExtractPlugin.loader : 'style-loader', { 193 loader: 'css-loader', 194 options: { 195 sourceMap: true 196 }, 197 }, "sass-loader"], 198 include: [resolve('src'), resolve('test')], 199 exclude: /(node_modules)/, 200 } 201 ] 202 }, 203 204 node: { 205 // prevent webpack from injecting useless setImmediate polyfill because Vue 206 // source contains it (although only uses it if it's native). 207 setImmediate: false, 208 // prevent webpack from injecting mocks to Node native modules 209 // that does not make sense for the client 210 dgram: 'empty', 211 fs: 'empty', 212 net: 'empty', 213 tls: 'empty', 214 child_process: 'empty' 215 } 216 }