webpack搭建前端環(huán)境

隨著webpack3.x的發(fā)布莉御,其功能也越來越強大,很多的項目的編譯打包工具也由gulp逐漸轉移到webpack氨距。

1. 用yarn代替npm

npm是一款非常好的包管理工具,之前在用npm安裝項目依賴的時候總會因為某些依賴包推出了新版本從而導致編譯結果不一樣的問題,這是因為在安裝依賴的時候npm并沒有鎖定依賴包的版本號(npm5好像已經解決了這個問題)喊积,每次安裝的時候總是獲取最新的依賴包,導致編譯結果不一樣玄妈。用yarn安裝依賴包可以完美的解決這個問題乾吻。
官網下載并安裝yarn
在命令行中執(zhí)行yarn -versions,若能輸出版本號表示安裝成功

2. 初始化生成package.json文件

執(zhí)行yarn init,填寫項目相關信息

3. 安裝項目依賴包和開發(fā)依賴包

執(zhí)行yarn add *** ,安裝項目依賴包,添加--dev表示安裝成開發(fā)依賴拟蜻,具體安裝的依賴包可查閱項目源碼中package.json文件

4. 建立常用庫配置文件并打包常用庫文件

1. 新建webpack-dll.config.js文件

這個配置文件只要是用來打包庫文件的绎签,這里介紹下幾個重點配置

output: {
    path: outputDir,
    filename: 'js/lib/[name].js',
    library: '[name]_library',
    /*libraryTarget: 'umd'*/
},

output中的library和libraryTarget是為了自定義打包后的文件以怎樣的形式輸出,這里采用默認的var形式

new webpack.DefinePlugin({
    'process.env': {
        NODE_ENV: JSON.stringify('production')
    }
}),

這里定義環(huán)境為開發(fā)環(huán)境酝锅,方便生成的庫文件直接用于開發(fā)環(huán)境

 //穩(wěn)定模塊ID
new webpack.HashedModuleIdsPlugin(),

new webpack.DllPlugin({
    // 本Dll文件中各模塊的索引诡必,供DllReferencePlugin讀取使用
    path: dll_manifest_name + '.json',
    //當前Dll的所有內容都會存放在這個參數指定變量名的一個全局變量下,注意與參數output.library保持一致
    name: '[name]_library',
    // 指定一個路徑作為上下文環(huán)境搔扁,需要與DllReferencePlugin的context參數保持一致爸舒,建議統(tǒng)一設置為項目根目錄
    context: __dirname,
})

這個是為了穩(wěn)定模塊ID并生成manifest文件稿蹲,方便在生產環(huán)境中通過讀取dll_manifest知道哪些文件已經被dll打包苛聘,而不需要再次打包

2. 生成庫文件dll.js

執(zhí)行 yarn dll,會在src/app/js/lib/文件夾下生成dll.js文件唱捣,該文件打包了vue2.5.13,axios0.17.1,flexible,webpack-zepto,具體要打包哪些文件可由webpack-dll.config.js中的entries來配置
若有必要可考慮生成dll.css

5. 建立配置文件

這里我將配置文件分為3個欢瞪,一個基礎配置文件,一個開發(fā)環(huán)境配置文件骑祟,一個生產環(huán)境配置文件潜圃,開發(fā)環(huán)境和生產環(huán)境配置文件通過webpack-merge插件調用基礎配置文件堵第。

基礎配置文件webpack.base.js

在基礎配置文件中包含了基本的配置信息,這里主要介紹下多頁面配置中的htmlWebpackPlugin插件的使用。

var pages = getEntry(entryDir + '/html/**/*.ejs');
for (var pathname in pages) {
    var conf = {
        // html模板文件輸入路徑
        template: entryDir + '/html/' + pathname + '.js',
        // html文件輸出路徑
        filename: outputDir + '/html/' + pathname + '.html',
        inject: true,
        cache: true, //只改動變動的文件
        minify: {
            removeComments: true,
            collapseWhitespace: false
        }
    };
    //根據chunks提取頁面js,css和公共verdors
    if (pathname in module.exports.entry) {
        conf.chunks = [pathname, 'vendors'];
    } else {
        conf.chunks = ['vendors'];
    }
    module.exports.plugins.push(new htmlWebpackPlugin(conf));
}

這里多頁面配置采用的是ejs模板幔摸,通過循環(huán)入口文件嗦玖,每個模板文件都配置一個htmlWebpackPlugin插件編譯,最后達到生成多個頁面的目的,通過chunks來提取頁面的js/css/img等

開發(fā)環(huán)境配置文件webpack.dev.js

在開發(fā)環(huán)境配置文件,通過使用webpack-dev-server插件來建立一個靜態(tài)服務器提供服務

devServer: {
    //設置服務器主文件夾挪略,默認情況下挽牢,從項目的根目錄提供文件
    contentBase: outputDir,
    //自動開啟默認瀏覽器
    //open: true,
    //開啟熱模塊替換,只重載頁面中變化了的部分
    //hot: true,
    //hotOnly:true,
    //開啟gzip壓縮
    compress: true,
    //使用inlilne模式,會觸發(fā)頁面的動態(tài)重載
    inline: true,
    //當編譯錯誤的時候,網頁上顯示錯誤信息
    overlay: {
        warnings: true,
        errors: true
    },
    //瀏覽器自動打開的文件夾
    //openPage: 'html/',
    //只在shell中展示錯誤信息
    //stats: 'errors-only',
    //設置域名摊求,默認是localhost
    host: 'localhost',
    port: 8080
},

在使用熱更新時需要使用熱更新插件

//熱模塊替換插件
new webpack.HotModuleReplacementPlugin()

生產環(huán)境配置文件webpack.prod.js

在生產環(huán)境中我們需要關注公共組件的分離卓研,代碼壓縮,文件緩存等問題睹簇,在公共組件分離時通過讀取dll_manifest文件知道哪些文件不用打包,從而減少打包后的文件大小

new webpack.HashedModuleIdsPlugin(),
new webpack.DllReferencePlugin({
    // 指定一個路徑作為上下文環(huán)境寥闪,需要與DllPlugin的context參數保持一致太惠,建議統(tǒng)一設置為項目根目錄
    context: __dirname,
    // 指定manifest.json
    manifest: require('../' + dll_manifest_name + '.json'),
    // 當前Dll的所有內容都會存放在這個參數指定變量名的一個全局變量下,注意與DllPlugin的name參數保持一致
    name: 'dll_library',
}),

在考慮代碼壓縮時通過使用以下配置

//壓縮css代碼
new OptimizeCssAssetsPlugin({
    assetNameRegExp: /\.css\.*(?!.*map)/g, //注意不要寫成 /\.css$/g
    cssProcessor: require('cssnano'),
    cssProcessorOptions: {
        discardComments: { removeAll: true },
        // 避免 cssnano 重新計算 z-index
        safe: true
    },
    canPrint: true
}),
//提取css
new ExtractTextPlugin('css/[name].css?v=[contenthash:8]'),
//壓縮JS代碼
new webpack.optimize.UglifyJsPlugin({
    compress: {
        warnings: false
    },
    output: {
        comments: false,
    }
}),

在考慮線上文件緩存問題時可以使用以下配置

output: {
    //publicPath: 'http://localhost:8080/',
    filename: 'js/[name].js?v=[chunkhash:8]'
},

這里建議使用chunkhash,使用hash每次編譯都會變化

參考文獻
  1. webpack官方文檔,
  2. Webpack的dll功能,
  3. 詳解webpack中的hash疲憋、chunkhash凿渊、contenthash區(qū)別
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市缚柳,隨后出現的幾起案子埃脏,更是在濱河造成了極大的恐慌,老刑警劉巖秋忙,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件彩掐,死亡現場離奇詭異,居然都是意外死亡灰追,警方通過查閱死者的電腦和手機堵幽,發(fā)現死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門狗超,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人朴下,你說我怎么就攤上這事努咐。” “怎么了殴胧?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵渗稍,是天一觀的道長。 經常有香客問我团滥,道長竿屹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任惫撰,我火速辦了婚禮羔沙,結果婚禮上,老公的妹妹穿的比我還像新娘厨钻。我一直安慰自己扼雏,他們只是感情好,可當我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布夯膀。 她就那樣靜靜地躺著诗充,像睡著了一般。 火紅的嫁衣襯著肌膚如雪诱建。 梳的紋絲不亂的頭發(fā)上蝴蜓,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天,我揣著相機與錄音俺猿,去河邊找鬼茎匠。 笑死,一個胖子當著我的面吹牛押袍,可吹牛的內容都是我干的诵冒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼谊惭,長吁一口氣:“原來是場噩夢啊……” “哼汽馋!你這毒婦竟也來了?” 一聲冷哼從身側響起圈盔,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤豹芯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后驱敲,有當地人在樹林里發(fā)現了一具尸體铁蹈,經...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年众眨,在試婚紗的時候發(fā)現自己被綠了木缝。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片便锨。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖我碟,靈堂內的尸體忽然破棺而出放案,到底是詐尸還是另有隱情,我是刑警寧澤矫俺,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布吱殉,位于F島的核電站,受9級特大地震影響厘托,放射性物質發(fā)生泄漏友雳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一铅匹、第九天 我趴在偏房一處隱蔽的房頂上張望押赊。 院中可真熱鬧,春花似錦包斑、人聲如沸流礁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽神帅。三九已至,卻和暖如春萌抵,著一層夾襖步出監(jiān)牢的瞬間找御,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工绍填, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留霎桅,地道東北人。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓讨永,卻偏偏與公主長得像滔驶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子住闯,可洞房花燭夜當晚...
    茶點故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內容