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 }

 

posted @ 2020-12-02 16:34  思猿客  阅读(2003)  评论(0编辑  收藏  举报