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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM