webpack 單入口項目基礎(chǔ)配置教程(七)

這次搞搞 提取公用模塊

但是這塊我也搞不太懂 就隨便寫寫

先整理下我們的 dist 文件夾, 目前我們所有的打包結(jié)果都平鋪在這個文件夾里不適合

修改 webpack.config.js 文件

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const ExtractTextPlugin = require("extract-text-webpack-plugin");

module.exports = {
    entry: './src/app.jsx',
    output: {
        path: path.join(__dirname, 'dist'),
+        filename: 'js/app.js'
    },
    module: {
        rules: [
            {
                test: /\.jsx$/,
                exclude: /(node_modules)/,
                use: {
                    loader: 'babel-loader',
                    options: {
                        presets: ['env', 'es2015', 'react']
                    }
                }
            },
            {
                test: /\.css$/,
                use: ExtractTextPlugin.extract({
                    fallback: "style-loader",
                    use: "css-loader"
                })
            },
            {
                test: /\.scss$/,
                use: ExtractTextPlugin.extract({
                    fallback: 'style-loader',
                    use: ['css-loader', 'sass-loader']
                })
            },
            {
                test: /\.(png|jpg|gif)$/,
                use: [
                    {
                        loader: 'url-loader',
                        options: {
                            limit: 8192,
+                            name: 'resource/[name].[ext]'
                        }
                    }
                ]
            },
            {
                test: /\.(svg|woff|woff2|eot|ttf|otf)$/,
                use: [
+                    {
+                        loader: 'url-loader',
+                        options: {
+                            limit: 8192,
+                            name: 'resource/[name].[ext]'
+                        }
+                    }
                ]
            }
        ]
    },
    plugins: [
        new HtmlWebpackPlugin({
            title: 'MY-WEBPACK',
            template: './src/index.html'
        }),
+        new ExtractTextPlugin("css/[name].css")
    ]
};

分別解釋下

output 里的修改是指定了打包后生成的 app.js 分配到 dist 下面的 js 文件夾里

圖片處理那邊的 loader 加上了 name 屬性的那一句 是把打包后生成的圖片文件以自己打包前的文件名命名, 并且放在 dist/resource 文件夾下. 其中 [name] 就是打包前的文件名前綴, [ext] 就是打包前的文件名后綴

字體那邊的處理修改成了和圖片處理一樣的寫法, 沒啥好講的

最后 plugins 里對 css 文件的處理也是以打包前的文件名命名 然后丟進 dist/css 文件夾里面, 但是在這個例子的項目結(jié)構(gòu)下, ExtractTextPlugin 的 [name] 是有坑的, 不過我懶得解釋, 正常項目也不可能有這個問題

這樣改完以后 再打包出來的 dist 文件夾就干凈多了 我們再繼續(xù)開始提公用模塊


網(wǎng)上的教程會叫你用這個東西

new webpack.optimize.CommonsChunkPlugin({
    name: 'common',
    filename: 'js/common.js'
})

本來沒啥問題 但是你如果現(xiàn)在電腦右下角的日期和我寫這個教程的時間相差不太遠 也沒有在安裝 webpack 的時候指定版本號的話 你的版本肯定是 4.0 往上了

你再用上面的方法就會報錯

Error: webpack.optimize.CommonsChunkPlugin has been removed, please use config.optimization.splitChunks instead.

就只能聽它的 它讓我們用啥就用啥

optimization: {
     splitChunks: {
     chunks: "initial", // 必須三選一: "initial" | "all"(默認(rèn)就是all) | "async"
     minSize: 0, // 最小尺寸相种,默認(rèn)0
     minChunks: 1, // 最小 chunk ,默認(rèn)1
     maxAsyncRequests: 1, // 最大異步請求數(shù), 默認(rèn)1
     maxInitialRequests : 1, // 最大初始化請求書寝并,默認(rèn)1
     name: function(){}, // 名稱箫措,此選項可接收 function
     cacheGroups:{ // 這里開始設(shè)置緩存的 chunks
         priority: 0, // 緩存組優(yōu)先級
         vendor: { // key 為entry中定義的 入口名稱
             chunks: "initial", // 必須三選一: "initial" | "all" | "async"(默認(rèn)就是異步)
             test: /react|lodash/, // 正則規(guī)則驗證,如果符合就提取 chunk
             name: "vendor", // 要緩存的 分隔出來的 chunk 名稱
             minSize: 0,
             minChunks: 1,
             enforce: true,
             maxAsyncRequests: 1, // 最大異步請求數(shù)衬潦, 默認(rèn)1
             maxInitialRequests : 1, // 最大初始化請求書斤蔓,默認(rèn)1
             reuseExistingChunk: true // 可設(shè)置是否重用該chunk(查看源碼沒有發(fā)現(xiàn)默認(rèn)值)
         }
     }
  }
 },

感興趣就先看這個網(wǎng)址 然后自己去扒文檔 http://ju.outofmemory.cn/entry/343762

當(dāng)然我們用不到上面這么多配置, 就隨便修改一下 webpack.config.js 文件

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const ExtractTextPlugin = require("extract-text-webpack-plugin");

module.exports = {
    entry: './src/app.jsx',
    output: {
        path: path.join(__dirname, 'dist'),
        filename: 'js/app.js'
    },
    module: {
        rules: [
            {
                test: /\.jsx$/,
                exclude: /(node_modules)/,
                use: {
                    loader: 'babel-loader',
                    options: {
                        presets: ['env', 'es2015', 'react']
                    }
                }
            },
            {
                test: /\.css$/,
                use: ExtractTextPlugin.extract({
                    fallback: "style-loader",
                    use: "css-loader"
                })
            },
            {
                test: /\.scss$/,
                use: ExtractTextPlugin.extract({
                    fallback: 'style-loader',
                    use: ['css-loader', 'sass-loader']
                })
            },
            {
                test: /\.(png|jpg|gif)$/,
                use: [
                    {
                        loader: 'url-loader',
                        options: {
                            limit: 8192,
                            name: 'resource/[name].[ext]'
                        }
                    }
                ]
            },
            {
                test: /\.(svg|woff|woff2|eot|ttf|otf)$/,
                use: [
                    {
                        loader: 'url-loader',
                        options: {
                            limit: 8192,
                            name: 'resource/[name].[ext]'
                        }
                    }
                ]
            }
        ]
    },
    plugins: [
        new HtmlWebpackPlugin({
            title: 'MY-WEBPACK',
            template: './src/index.html'
        }),
        new ExtractTextPlugin("css/[name].css")
    ],
+    optimization: {
+        splitChunks: {
+            chunks: "all",
+            name: 'common'
+        }
+    },
};

但是 optimization 我不懂, 所以不解釋了, 不然可能每一句都是錯的, 誤導(dǎo)別人不太好

打包之后會看到 dist 下面自動做了一些公共 chunks, 但是具體的實現(xiàn)我也不懂

optimization.splitChunks 自動分包的機制是這樣的

  • 新代碼塊可以被共享引用,或者這些模塊都是來自 node_modules 文件夾里面
  • 新代碼塊大于30kb (min + gziped 之前的體積)
  • 按需加載的代碼塊镀岛,最大數(shù)量應(yīng)該小于或者等于5
  • 初始加載的代碼塊弦牡,最大數(shù)量應(yīng)該小于或等于3

其它的我也講不清了 但是我們已經(jīng)稀里糊涂的解決了 提取公用模塊 的需求

接著是 處理全局問題(比如 jq 的全局變量)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市漂羊,隨后出現(xiàn)的幾起案子驾锰,更是在濱河造成了極大的恐慌,老刑警劉巖走越,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件椭豫,死亡現(xiàn)場離奇詭異,居然都是意外死亡旨指,警方通過查閱死者的電腦和手機赏酥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谆构,“玉大人今缚,你說我怎么就攤上這事〉偷” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵瞬项,是天一觀的道長蔗蹋。 經(jīng)常有香客問我,道長囱淋,這世上最難降的妖魔是什么猪杭? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮妥衣,結(jié)果婚禮上皂吮,老公的妹妹穿的比我還像新娘。我一直安慰自己税手,他們只是感情好蜂筹,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著芦倒,像睡著了一般艺挪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上兵扬,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天麻裳,我揣著相機與錄音口蝠,去河邊找鬼。 笑死津坑,一個胖子當(dāng)著我的面吹牛妙蔗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播疆瑰,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼眉反,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了乃摹?” 一聲冷哼從身側(cè)響起禁漓,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎孵睬,沒想到半個月后播歼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡掰读,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年秘狞,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蹈集。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡烁试,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拢肆,到底是詐尸還是另有隱情减响,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布郭怪,位于F島的核電站支示,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鄙才。R本人自食惡果不足惜颂鸿,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望攒庵。 院中可真熱鬧嘴纺,春花似錦、人聲如沸浓冒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽稳懒。三九已至熔萧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背佛致。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工贮缕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人俺榆。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓感昼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親罐脊。 傳聞我的和親對象是個殘疾皇子定嗓,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 版權(quán)聲明:本文為博主原創(chuàng)文章上炎,未經(jīng)博主允許不得轉(zhuǎn)載恃逻。 webpack介紹和使用 一、webpack介紹 1藕施、由來 ...
    it筱竹閱讀 11,051評論 0 21
  • 1. 新建一個文件夾,命名為 webpack-cli , webpack-cli 就是你的項目名,項目名建議使用小...
    魯大師666閱讀 1,467評論 1 3
  • 寫在開頭 先說說為什么要寫這篇文章, 最初的原因是組里的小朋友們看了webpack文檔后, 表情都是這樣的: (摘...
    Lefter閱讀 5,276評論 4 31
  • GitChat技術(shù)雜談 前言 本文較長寇损,為了節(jié)省你的閱讀時間,在文前列寫作思路如下: 什么是 webpack裳食,它要...
    蕭玄辭閱讀 12,679評論 7 110
  • 更新:Webpack4已經(jīng)發(fā)布矛市,本篇是基于Webpack3的,請注意诲祸。更正:1.package.json中使用了應(yīng)...
    HermitCarb閱讀 1,230評論 2 4