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 }