這是webpack4演示,webpack5有些插件不在推薦,
1. webpack.base.config.js文件的配置說明
const path = require('path');
const webpack = require('webpack');
const ExtractTextPlugin = require('extract-text-webpack-plugin'); // 該插件的主要是為了抽離css樣式,防止將樣式打包在js中引起頁面樣式加載錯亂的現象
// const CleanWebpackPlugin = require('clean-webpack-plugin');function resolve (dir) {return path.join(__dirname, dir);
}module.exports = {// webpack打包入口entry: {main: './src/main',vendors: './src/vendors' // 去除不必要的插件,在index.html中需要引入這個文件// 也就是在index.html中加入 <script src="/build/vendor.js"></script>},// webpack打包轉換后的文件輸出到磁盤位置output: {// __dirname始終指向被執行js文件的絕對路徑,這里的path就是指向dist文件夾(也就是輸出的位置)path: path.join(__dirname, '../dist/')},// externals: {// 'vue': 'Vue',// 'iview': 'iview',// 'vue-router': 'VueRouter',// 'vuex': 'Vuex',// 'js-cookie': 'Cookies',// // 'tinymce': 'tinymce',// 'axios': 'axios',// // 'echarts': 'echarts',// // 'html2canvas': 'html2canvas',// // 'sortablejs': 'Sortable'// },/*** loader是模塊解析,模塊轉換器* webpack是模塊打包工具,而模塊不僅僅是js,還可以是css,圖片或者其他格式* 但是webpack默認只處理js和json,其他模塊就需要用loader了*/ // 模塊配置,在webpack里一切皆模塊,用來配置需要的匹配規則及使用哪種loader轉換器module: {rules: [{test: /\.vue$/, // 正則表達式匹配規則,適配vueloader: 'vue-loader', // 使用vue-loader,加載和轉義vue組件options: {loaders: {less: ExtractTextPlugin.extract({use: ['css-loader?minimize', 'autoprefixer-loader', 'less-loader'],fallback: 'vue-style-loader'}),css: ExtractTextPlugin.extract({use: ['css-loader', 'autoprefixer-loader'],fallback: 'vue-style-loader'})}}},{test: /iview\/.*?js$/,loader: 'babel-loader'},{test: /\.js$/,loader: 'babel-loader',exclude: /node_modules/},{test: /\.css$/,use: ExtractTextPlugin.extract({use: ['css-loader?minimize', 'autoprefixer-loader'], // 指定需要什么樣的loader去編譯文件,這里由于源文件是.css所以選擇css-loaderfallback: 'style-loader' // 編譯后用什么loader來提取css文件})},{test: /\.less/,use: ExtractTextPlugin.extract({use: ['autoprefixer-loader', 'less-loader'], // autoprefixer-loader具有自動添加css前綴的功能fallback: 'style-loader'})},{test: /\.(gif|jpg|png|woff|svg|eot|ttf)\??.*$/,loader: 'url-loader'},{test: /\.(html|tpl)$/,loader: 'html-loader'}]},resolve: {// resolve.extensions在導入語句沒帶文件后綴時,webpack會自動帶上后綴,去嘗試查找文件是否存在,但是在查找的時候,會耗費一定的打包時間extensions: ['.js', '.vue'],alias: { // resolve.alias配置通過別名來將原導入路徑映射成一個新的導入路徑(優化開發體驗)'vue': 'vue/dist/vue.esm.js','@': resolve('../src'),'@views': resolve('../src/views'),'assets': resolve('../src/assets/'),'store': resolve('../src/store/'),'jquery': resolve('../src/common/js/jquery.js')}},// 增加一個pluginsplugins: [new webpack.ProvidePlugin({$: "jquery",jQuery: "jquery"}),// new CleanWebpackPlugin('dist/*.*', {// root: __dirname,// verbose: true,// dry: false// })],
};
2. webpack.dev.config.js文件的配置說明(開發環境)
const webpack = require('webpack');
// HtmlWebpackPlugin作用:
// 1、為html文件中引入的外部資源如script、link動態添加每次compile后的hash,防止引用緩存的外部文件問題
// 2、可以生成創建html入口文件,比如單頁面可以生成一個html文件入口,配置N個html-webpack-plugin可以生成N個頁面入口
const HtmlWebpackPlugin = require('html-webpack-plugin');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const merge = require('webpack-merge');
const webpackBaseConfig = require('./webpack.base.config.js');
const fs = require('fs'); //fs 是 file-system 的簡寫,就是文件系統的意思;在 Node 中如果想要進行文件操作,就必須引入 fs 這個核心模塊fs.open('./src/config/env.js', 'w', function (err, fd) {const buf = 'export default "development";';// node --version < v10.1.0// fs.write(fd, buf, 0, buf.length, 0, function (err, written, buffer) {});// node --version > v10.1.0fs.write(fd, buf, 0, 'utf-8', function (err, written, buffer) {if (err) {throw new Error(err);}});
});module.exports = merge(webpackBaseConfig, {// devtool: '#source-map',devtool: '#cheap-module-eval-source-map',output: {publicPath: '/dist/',filename: '[name].js',chunkFilename: '[name].chunk.js'},plugins: [ // 每個插件的具體API配置new ExtractTextPlugin({filename: '[name].css',allChunks: true}),new webpack.optimize.CommonsChunkPlugin({name: 'vendors',filename: 'vendors.js'}),new HtmlWebpackPlugin({ // 打包輸出HTMLfilename: '../index.html',template: './src/template/index.ejs',title: '同花順管理平臺',inject: false})],devServer: {port: 8082,host: '0.0.0.0',watchOptions: { // 配置webpack服務ignored: '/node_modules/', // 不監測poll: 1200 // 監測修改的時間(ms)},// lazy: true,//只有在請求時才編譯包(bundle)。這意味著 webpack 不會監視任何文件改動。我們稱之為“惰性模式”。proxy: { // 設置代理'/yyzt-web': {// target: 'http://121.33.247.51:8602''http://cbas.ths8.com',// target: 'http://127.0.0.1:9080',// target: 'http://cbas.ths8.com',changeOrigin: true,target: 'http://cbas.ths8.com:81',pathRewrite: {'^/yyzt-web': '/yyzt3-web'}},'/yyzt3-web': {// target: 'http://121.33.247.51:8602''http://cbas.ths8.com',// target: 'http://127.0.0.1:9080',target: 'http://cbas.ths8.com:81',// target: 'http://113.9.77.117:9711',// target: 'http://172.20.51.196:8080',changeOrigin: true,pathRewrite: {'^/yyzt3-web': '/yyzt3-web'}},// 自己添加的圖片代理'/group1': { // 需要請求的資源target: "http://cbas.ths8.com:81", // 目標域名及地址changeOrigin: true, // 是否跨域pathRewrite: { // 地址重定向'^/group1': '/group1' // 也就是將前面的group1替換成后面的(這里是一樣的,所以可以不寫)}},'/cbas': {// target: 'http://121.33.247.51:8602''http://cbas.ths8.com',// target: 'http://127.0.0.1:9080',target: 'http://106.37.195.27:8083',changeOrigin: true,pathRewrite: {'^/cbas': '/cbas'}},'/yyzt-html': {// target: 'http://192.168.51.234:8080',target: 'http://point.stocke.com.cn',changeOrigin: true,pathRewrite: {'^/yyzt-html': '/yyzt-html'}},'/point': {// target: 'http://121.33.247.51:8602''http://cbas.ths8.com' 'http://127.0.0.1:9102',target: 'http://127.0.0.1:9102',changeOrigin: true,pathRewrite: {'^/point': '/point'}},'/hexinifs': {// target: 'http://192.168.51.234:8080',target: 'http://point.stocke.com.cn',changeOrigin: true,pathRewrite: {'^/hexinifs': '/hexinifs'}},'/yyzt-uamp-web': {target: 'http://point.stocke.com.cn',// target: 'http://cbas.ths8.com',changeOrigin: true,pathRewrite: {'^/yyzt-uamp-web': '/yyzt-uamp-web'}}}}
});
3. webpack.prod.config.js文件的配置說明(生產環境)
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const merge = require('webpack-merge');
const webpackBaseConfig = require('./webpack.base.config.js');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const fs = require('fs');
var path = require('path')
const FastUglifyJsPlugin = require('fast-uglifyjs-plugin');fs.open('./src/config/env.js', 'w', function (err, fd) {const buf = 'export default "production";';// fs.write(fd, buf, 0, buf.length, 0, function(err, written, buffer) {});fs.write(fd, buf, 0, 'utf-8', function (err, written, buffer) { });
});module.exports = merge(webpackBaseConfig, {output: {publicPath: './dist/',filename: '[name].[hash].js',chunkFilename: '[name].[hash].chunk.js'},plugins: [new ExtractTextPlugin({filename: '[name].[hash].css',allChunks: true}),new webpack.optimize.CommonsChunkPlugin({name: 'vendors',filename: 'vendors.[hash].js'}),new webpack.DefinePlugin({'process.env': {NODE_ENV: '"production"'}}),// new webpack.optimize.UglifyJsPlugin({// compress: {// warnings: false// }// }),new FastUglifyJsPlugin({sourceMap: true,compress: {warnings: false,drop_console: true,},// debug設為true可輸出詳細緩存使用信息:debug: true,// 默認開啟緩存,提高uglify效率,關閉請使用 false:cache: true,// 默認緩存路徑為項目根目錄,手動配置請使用:cacheFolder: path.resolve(__dirname, '../.build_cache'),// 工作進程數,默認os.cpus().lengthworkerNum: 2}),new HtmlWebpackPlugin({filename: '../index_prod.html',template: './src/template/index.ejs',title: '同花順管理平臺',inject: false}),new CleanWebpackPlugin(['./dist/main.*.css', './dist/*.js'], //匹配刪除的文件{root: __dirname, //根目錄verbose: true, //開啟在控制臺輸出信息dry: true //啟用刪除文件})]
});
4.webpack-merge 合并配置文件
webpack-merge 是一個工具,它允許你將多個 webpack 配置文件合并成一個,這對于維護不同環境(如開發環境、生產環境)的配置特別有用。通過使用 webpack-merge,你可以保持基礎配置不變,同時為不同環境添加或覆蓋特定的配置選項。
以下是如何使用 webpack-merge 來合并 webpack 配置文件的示例:
首先,你需要安裝 webpack-merge:
bash復制代碼
npm install --save-dev webpack-merge
yarn add webpack-merge --dev
安裝完成后,webpack-merge 將被添加到你的 node_modules 目錄中,并且其版本信息將被添加到你的 package.json 文件的 devDependencies 部分。
然后,你可以創建多個配置文件,例如一個基礎配置文件 webpack.base.config.js,一個用于開發環境的配置文件 webpack.dev.config.js,以及一個用于生產環境的配置文件 webpack.prod.config.js。
webpack.base.config.js
javascript復制代碼const path = require('path'); module.exports = { entry: { app: './src/index.js' }, output: { filename: '[name].bundle.js', path: path.resolve(__dirname, 'dist') }, module: { rules: [ // 通用加載器配置 ] }, // 其他通用配置...
};
webpack.dev.config.js
javascript復制代碼const merge = require('webpack-merge');
const baseConfig = require('./webpack.base.config.js'); module.exports = merge(baseConfig, { mode: 'development', devtool: 'inline-source-map', devServer: { contentBase: './dist', hot: true }, // 開發環境特有的配置...
});
webpack.prod.config.js
javascript復制代碼const merge = require('webpack-merge');
const baseConfig = require('./webpack.base.config.js'); module.exports = merge(baseConfig, { mode: 'production', optimization: { minimize: true }, plugins: [ // 生產環境特有的插件... ], // 生產環境特有的配置...
});
在上面的示例中,webpack.dev.config.js 和 webpack.prod.config.js 都使用了 webpack-merge 來合并 webpack.base.config.js 中的基礎配置。然后,它們各自添加了針對開發環境和生產環境的特定配置。
通過這種方式,你可以確保基礎配置的一致性,并只關注不同環境之間的差異。當你運行 webpack 時,只需要根據當前環境選擇正確的配置文件即可。
例如,在開發環境中,你可以這樣運行 webpack:
bash復制代碼
npx webpack --config webpack.dev.config.js
在生產環境中,你可以這樣運行:
bash復制代碼
npx webpack --config webpack.prod.config.js
或者,你可以在 package.json 的 scripts 部分設置相應的命令,以便更方便地運行 webpack。
常用的loader和插件種類繁多,以下是一些常見的示例:
Loader示例:
- babel-loader:用于將ES6+的語法轉化為向后兼容的JavaScript版本,使得新特性能夠在舊版瀏覽器中使用。
- style-loader 和 css-loader:用于處理CSS文件。style-loader將CSS添加到DOM中,而css-loader解析CSS文件中的import和url()。
- file-loader 和 url-loader:用于處理在JavaScript中引入的文件,例如圖片或字體文件。它們能夠將文件移動到輸出目錄,并在代碼中引用它們。
- vue-loader:專門用于加載Vue.js組件,處理單文件組件的.vue文件。
- ts-loader:用于加載TypeScript文件,并將其轉換為JavaScript。
插件示例:
- HtmlWebpackPlugin:簡化HTML文件的創建,自動引入打包后的JS文件。
- MiniCssExtractPlugin:將CSS提取到單獨的文件中,而不是嵌入到JS中。
- CleanWebpackPlugin:在每次構建之前清理輸出目錄,確保沒有舊的構建文件。
- DefinePlugin:允許在編譯時創建配置的全局常量,這對于配置模式或環境變量非常有用。
- CopyWebpackPlugin:將單個文件或整個目錄復制到構建目錄中。
- WebpackBar:在構建過程中顯示進度條和相關信息,提供視覺反饋。
這些只是眾多可用loader和插件中的一部分。實際上,webpack的生態系統非常龐大,你可以根據項目需求選擇適合的loader和插件。同時,隨著技術的不斷發展,新的loader和插件也不斷涌現,建議經常查看webpack的官方文檔和社區資源,以獲取最新的信息和最佳實踐。