最近復習了一下webpack,使用的是4.0版本。
下圖是基本目錄結構,最后留有代碼地址,有興趣可以去看看。
直接上代碼(依賴未完全使用):
項目的所有依賴都可以安裝,每個都有詳細的注釋。】
const path = require('path'); const uglify = require('uglifyjs-webpack-plugin'); //js壓縮插件 const htmlPlugin = require('html-webpack-plugin'); //實現html打包功能,引用好路徑的到html來 const glob = require('glob'); const CleanWebpackPlugin = require('clean-webpack-plugin');// 打包前先清空dist const MiniCssExtractPlugin = require("mini-css-extract-plugin");//分離js中的css const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin");//css壓縮 const webpack = require('webpack'); const devMode = process.env.NODE_ENV !== 'production'; var website = { publicPath: "http://localhost:8888/" // publicPath:"http://192.168.1.103:8888/" } function recursiveIssuer(m) { if (m.issuer) { return recursiveIssuer(m.issuer); } else if (m.name) { return m.name; } else { return false; } } module.exports = { mode: 'production', // 模式配置 production,development entry: { //入口文件配置 main: path.resolve(__dirname, './src/main.js'), main2: path.resolve(__dirname, './src/main2.js'), }, output: { //出口文件配置 //path.resolve把一個路徑或路徑片段的序列解析為一個絕對路徑 path: path.resolve(__dirname, './dist'), // 打包后的目錄,必須是絕對路徑 filename: '[name].[hash:4].js', // [name]打包后的文件名稱,進入是什么名字出來也是 chunkFilename: '[name].[hash].js',//文件開啟按需加載后,會生成多個小文件 // 2.添加hash可以防止文件緩存,每次都會生成4位的hash串 // filename: 'bundle.[hash:4].js', // path: path.resolve(__dirname, '../dist') publicPath: website.publicPath //publicPath:主要作用就是處理靜態文件路徑的。 }, //模塊,例如解讀CSS,圖片轉換,壓縮 module: { rules: [ //babel 配置 { test:/\.(jsx|js)$/, use:{ loader:'babel-loader?cacheDirectory',//loader的cacheDirectory選項,開啟后用緩存,提升打包速度 }, include: /src/, // 只轉化src目錄下的js exclude:/node_modules/ //排除 }, //css loader { test: /\.(sa|sc|c)ss$/, use: [ // devMode ? 'style-loader' : MiniCssExtractPlugin.loader, MiniCssExtractPlugin.loader,//js分離css,使用style-loader不會分離 'css-loader', 'postcss-loader', 'sass-loader', ], }, //圖片(主要css中) loader { test: /\.(png|jpg|gif|jpeg)/, //是匹配圖片文件后綴名稱 use: [{ loader: 'url-loader', //是指定使用的loader和loader的配置參數 options: { limit: 500, //是把小於500B的文件打成Base64的格式,寫入JS outputPath: 'images/', //打包后的圖片放到images文件夾下 } }] }, // 引用字體圖片和svg圖片 { test: /\.(eot|ttf|woff|svg)$/, use: 'file-loader' }, // HTML中的圖片 { test: /\.(htm|html)$/i, use: ['html-withimg-loader'] }, ] }, optimization: { // minimize:true,//如果mode是production類型,minimize的默認值是true,執行默認壓縮, minimizer:[], splitChunks: { // chunks: "async",//三個個可選值:initial(初始塊)、async(按需加載塊)、all(全部塊),默認為all; // 值為all/initial/async/function(chunk),值為function時第一個參數為遍歷所有入口chunk時的chunk模塊, // chunk._modules為chunk所有依賴的模塊, // 通過chunk的名字和所有依賴模塊的resource可以自由配置, // 會抽取所有滿足條件chunk的公有模塊,以及模塊的所有依賴模塊,包括css // minSize: 30000, //表示在壓縮前的最小模塊大小,默認值是30kb // minChunks: 1, // 表示被引用次數,默認為1; // maxAsyncRequests: 5, //所有異步請求不得超過5個,最大的按需(異步)加載次數.默認為1; // maxInitialRequests: 3, //初始話並行請求不得超過3個,最大的初始化加載次數,默認為1; // automaticNameDelimiter:'~',//名稱分隔符,默認是~ // name: true, //打包后的名稱,默認是chunk的名字通過分隔符(默認是~)分隔 cacheGroups: {//設置緩存組用來抽取滿足不同規則的chunk,下面以生成common為例 common: { name: 'common', //抽取的chunk的名字 chunks(chunk) { //同外層的參數配置,覆蓋外層的chunks,以chunk為維度進行抽取 }, test(module, chunks) { //可以為字符串,正則表達式,函數,以module為維度進行抽取, // 只要是滿足條件的module都會被抽取到該common的chunk中, // 為函數時第一個參數是遍歷到的每一個模塊,第二個參數是每一個引用到該模塊的chunks數組。 // 自己嘗試過程中發現不能提取出css,待進一步驗證。 }, // priority: 10, //優先級,一個chunk很可能滿足多個緩存組,會被抽取到優先級高的緩存組中 // minChunks: 2, //最少被幾個chunk引用 // reuseExistingChunk: true,// 如果該chunk中引用了已經被抽取的chunk,直接引用該chunk,不會重復打包代碼 // enforce: true // 如果cacheGroup中沒有設置minSize,則據此判斷是否使用上層的minSize,true:則使用0,false:使用上層minSize }, fooStyles: { name: 'main', test: (m,c,entry = 'main') => m.constructor.name === 'CssModule' && recursiveIssuer(m) === entry, chunks: 'all', enforce: true }, barStyles: { name: 'main2', test: (m,c,entry = 'main2') => m.constructor.name === 'CssModule' && recursiveIssuer(m) === entry, chunks: 'all', enforce: true } } } }, //插件,用於生產模版和各項功能 plugins: [ new CleanWebpackPlugin('dist'), // 打包前先清空 new uglify( // {//js壓縮插件 // cache: false,//啟用文件緩存 // parallel: true,//使用多進程並行運行來提高構建速度 // sourcMap: true//使用源映射將錯誤消息位置映射到模塊(這會減慢編譯速度) // } ), new MiniCssExtractPlugin({//分離js中的css // 類似 webpackOptions.output里面的配置 可以忽略 // filename,對應於entry里面生成出來的文件名 // chunkFilename,未被列在entry中,卻又需要被打包出來的文件命名配置,如異步加載的模塊文件 filename: devMode ? 'css/[name].css' : '[name].[hash].css',//可以更變文件產生路徑 chunkFilename: devMode ? 'css/[id].css' : '[id].[hash].css', }), new OptimizeCSSAssetsPlugin({//css壓縮 // assetNameRegExp: /\.main\.css$/g,//一個正則表達式,指示應優化\最小化的文件的名稱。 // cssProcessor: require('cssnano'),//用於優化\最小化CSS的CSS處理器,默認為cssnano // cssProcessorPluginOptions: {},//傳遞給cssProcessor的選項,默認為 {} // canPrint: true//一個布爾值,指示插件是否可以將消息打印到控制台,默認為 true }), new htmlPlugin({ minify: { //是對html文件進行壓縮 removeAttributeQuotes: true //removeAttrubuteQuotes是卻掉屬性的雙引號。 }, hash: true, //為了開發中js有緩存效果,所以加入hash,這樣可以有效避免緩存JS。 template: './src/index.html' //是要打包的html模版路徑和文件名稱。 }), new webpack.HotModuleReplacementPlugin(), // 熱更新,熱更新不是刷新 ], //配置webpack開發服務功能,npm install webpack-dev-server devServer: { //設置基本結構 contentBase: path.resolve(__dirname, '../dist'), host: 'localhost',//服務器IP地址,可以是localhost compress: true,//服務端壓縮是否開啟 open: true,// 自動打開瀏覽器 hot: true ,// 開啟熱更新 port: 8888 } }
最后放上代碼文件地址 https://github.com/TKBnice/TKBnice-webpack4.0