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 }