摘要:從再到目前當(dāng)紅明星,前端模塊打包技術(shù)日新月異,在今年月份和月份左右接連更新了和版本為了減少冗余模塊,縮減文件大小,中也加入了關(guān)于的特征,可以查看知乎如何評(píng)價(jià)新引入的代碼優(yōu)化技術(shù)的討論。
從Grunt->gulp->webpack,再到目前當(dāng)紅明星rollup,前端模塊打包技術(shù)日新月異,webpack在今年1月份和6月份左右接連更新了v2和v3版本,為了減少冗余模塊,縮減bundle文件大小,webpack v2中也加入了tree-shacking,關(guān)于tree-shacking的特征,可以查看知乎如何評(píng)價(jià) Webpack 2 新引入的 Tree-shaking 代碼優(yōu)化技術(shù)?的討論。
webpack在推出 v2之后迅速推出了v3版本,前段時(shí)間在知乎看到webpack作者LarkInn(他已經(jīng)入駐sf)說(shuō)后續(xù)會(huì)維持一個(gè)更快、一致和更穩(wěn)定的發(fā)布周期點(diǎn)這,難道要步Angular的后塵,作為吃瓜群眾表示很震驚,因?yàn)槟壳白约哼@邊項(xiàng)目webpack還停留在1.x版本,鑒于減少日后升級(jí)難度的想法,包括后續(xù)要做代碼和流程優(yōu)化,我將webpack升級(jí)到了v2版本,在這主要想把這個(gè)升級(jí)過(guò)程遇到的一些問(wèn)題分享出來(lái),也方便大家踩坑。
我能想到最簡(jiǎn)單粗暴的做法就是直接把版本號(hào)改了下載新包看下會(huì)發(fā)生什么。使用npm info webpack查看了一下版本的發(fā)布信息,我更新到2.6.1版本,也是3.0前的最后一個(gè)版本,
期待一大堆報(bào)錯(cuò),很尷尬,發(fā)現(xiàn)webpack仍然使用1.x版本工作,也就是說(shuō)包并沒(méi)有更新到,查了一下發(fā)現(xiàn)可能緩存造成的,使用npm cache clean但貌似也不管用,索性直接把node_module刪除了,重新安裝了一下模塊,打包,果然報(bào)錯(cuò)了:
報(bào)錯(cuò)信息:
throw new WebpackOptionsValidationError configuration.resolve.extensions[0] should not be empty ...
提示是resolve.extensions寫法有問(wèn)題,查看了一下extensions文檔
This option no longer requires passing an empty string. 不再支持空字符的寫法了。
webpack1.x寫法:
resolve: { root: .... extensions: ["", ".js", ".jsx", ".json"] },
webpack2寫法:
resolve: { root: .... extensions: ["*", ".js", ".jsx", ".json"] },
報(bào)錯(cuò)信息:
configuration.resolve has an unknown property "root". These properties are valid: ...
原來(lái)root寫法也變了,root放在modules里了。
resolve: { modules: [ path.resolve(__dirname, "src"), "node_modules" ] } }
configuration.module.rules[0].use should be one of these: ...
接下來(lái)應(yīng)該就是一堆loader寫法有問(wèn)題,loader已經(jīng)全部改成了rules的寫法,并且為了更加嚴(yán)謹(jǐn)?之前省略的loader后綴也得加上。由于webpack2會(huì)自動(dòng)給加載json文件,所以json-loader也就不再需要了,查看這里。
webpack1.x寫法:
webpackConfig.module.loaders = [{ test: /.(js|jsx)$/, exclude: /node_modules/, loader: "babel", query: "" }, { test: /.json$/, loader: "json" }]
webpack2.x寫法:
webpackConfig.module.loaders = [{ test: /.(js|jsx)$/, exclude: /node_modules/, use: [{ loader: "babel-loader", query: { cacheDirectory: true, plugins: [..plugins], presets: [..presets] } }] }]
css-loader,style-loader的配置:
webpack1.x寫法:
webpackConfig.module.loaders.push({ test: /.css$/, exclude: null, loaders: [ "style", "css?modules&importLoaders=1&sourceMap&minimize", "postcss?pack=default" ] })
webpack2.x寫法:
webpackConfig.module.rules.push({ test: /.css$/, exclude: null, use: [ "style-loader", { loader: "css-loader", opitions: { modules: true, sourceMap: true, minimize: true, importLoaders: 1 } }, "postcss-loader" ] })
==注意== 這里css-loder的minimize默認(rèn)是不開(kāi)啟的,建議開(kāi)啟壓縮可以縮小文件大小。babel-loader的cacheDirectory開(kāi)啟緩存可以加速編譯過(guò)程。
修改原來(lái)的ExtractTextPlugin插件配置,對(duì)css文件進(jìn)行處理,發(fā)現(xiàn)報(bào)如下錯(cuò)誤:
報(bào)錯(cuò):
throw new Error("Chunk.entry was removed. Use hasRuntime()");
google了一下發(fā)現(xiàn)是當(dāng)前版本(1.0.1)已經(jīng)不適用, 升級(jí)到2.0。
webpackConfig.module.rules.push({ test: /.css$/, use: extractText.extract({ use:[ { loader: "style-loader" }, { loader: "css-loader", options: { sourceMap: true, minimize: true, importLoaders: 1, modules: true } }, { loader: "postcss-loader" } ] }) }) const extractText = new ExtractTextPlugin({ filename: "styles/[name].[contenthash].css", allChunks: true, disable: __DEV__ }) webpackConfig.plugins.push(extractStyles)
postcss-loader插件配置會(huì)麻煩一些,有兩種方法:
一種是新建postcss.config.js文件
module.exports = { plugins: [ require("autoprefixer")({ /* ...options */ }) ] }
另一種:
在webpack.config.js使用LoaderOptionsPlugin
webpackConfig.plugins.push( new webpack.LoaderOptionsPlugin({ options: { postcssLoader: () => { require("autoprefixer")(/* ...options */ ) } } }) )
DeprecationWarning: loaderUtils.parseQuery() received a non-string value which can be problematic, see https://github.com/webpack/lo...
貌似是loader-utils模塊引起的,沒(méi)有太明白問(wèn)題出在哪,issues地址,我在webpack.config.js在加上下面代碼解決了。
process.noDeprecation = true
v1.x的時(shí)候大家都在吐槽webpack文檔問(wèn)題,v2文檔確實(shí)提升不少,包括這次的升級(jí)如果跟著指南走,基本不會(huì)出什么大問(wèn)題,只是中途在配置ExtractTextPlugin、postcss插件時(shí)折騰了一些時(shí)間。完成這次的升級(jí)后,后續(xù)準(zhǔn)備對(duì)流程再進(jìn)一步的優(yōu)化,縮減打包時(shí)間、減少bundle大小等。
這里推薦一款插件webpack-visualizer-plugin,可以將項(xiàng)目的打包情況可視化,清楚了解到每個(gè)模塊的大小、占比,方便后續(xù)的優(yōu)化。
如果對(duì)v2版配置還有問(wèn)題的同學(xué),可以查看我之前的一個(gè)v3.1版本的webpack.config.js。
附:
1.webpack v1至v2升級(jí)指南
官方webapck 1->2升級(jí)guides
另一位同學(xué)翻譯的升級(jí)指南中文版
2.幾篇關(guān)于升級(jí)優(yōu)化的好文章:
Boost webpack build performance | Optimising webpack build performance | Webpack 構(gòu)建性能優(yōu)化探索
webpack2 終極優(yōu)化
3.關(guān)于webpack的好文章集合(awesome-webpack)
搜羅一切webpack的好文章好工具
(ps:第一次寫關(guān)于webpack的文章,不免有誤,請(qǐng)及時(shí)斧正)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/83978.html
摘要:本篇不包含所有坑,暫時(shí)只記錄自己踩到的部分坑一安裝安裝最新版本安裝新增依賴這個(gè)在中,本身和它的是在同一個(gè)包中,中將兩個(gè)分開(kāi)管理。我記錄下自己更新這個(gè)的過(guò)程,以下前半部分可以直接跳過(guò)。以下記錄踩坑過(guò)程。 本篇不包含所有坑,暫時(shí)只記錄自己踩到的部分坑 一.安裝 安裝webpack4最新版本 npm install --save-dev webpack@4 安裝新增依賴 webpack-c...
摘要:之前做過(guò)一點(diǎn)前端的小項(xiàng)目所以前端還算熟練因?yàn)樽罱跍?zhǔn)備所以想能不能寫一個(gè)背單詞軟件正好這學(xué)期有個(gè)開(kāi)發(fā)課,就用來(lái)當(dāng)大作業(yè)了前端后端如何在下調(diào)試當(dāng)然是代理啦在之前兩個(gè)項(xiàng)目中為了不用代理強(qiáng)行在后端啟用了事實(shí)證明這是個(gè)愚蠢的決定因?yàn)橥耆贿m合做后端 之前做過(guò)一點(diǎn)前端的小項(xiàng)目所以前端還算熟練因?yàn)樽罱跍?zhǔn)備GRE所以想能不能寫一個(gè)背單詞軟件正好這學(xué)期有個(gè)Android開(kāi)發(fā)課,就用來(lái)當(dāng)大作業(yè)了 前端...
摘要:因?yàn)檫@里我的文件夾名字起的叫,所以默認(rèn)生成的中的就是,而是關(guān)鍵字會(huì)導(dǎo)致,只需要打開(kāi)把隨便改一下即可。其實(shí)關(guān)于都還有很多參數(shù)配置和方法,不過(guò)對(duì)于入門,在上面這些東西搞明白后,就已經(jīng)可以跑起來(lái)一個(gè)簡(jiǎn)單的流程了。 WebPack已經(jīng)火了好久,幾乎已經(jīng)成為一個(gè)前端的必備技能,先翻譯官網(wǎng)兩句話。 WebPack是一個(gè)靈活的、可擴(kuò)展的、公平的、可用于生產(chǎn)環(huán)境的、開(kāi)源的模塊打包器。 WebPack...
摘要:前段時(shí)間項(xiàng)目組計(jì)劃快速開(kāi)發(fā)一個(gè)新的項(xiàng)目,開(kāi)發(fā)那邊提供殼子和部分系統(tǒng)級(jí)功能,所有的頁(yè)面由完成,考慮兼容性安卓及。后面會(huì)繼續(xù)優(yōu)化,先把目前的基本部署方式記錄下來(lái)。 前段時(shí)間項(xiàng)目組計(jì)劃快速開(kāi)發(fā)一個(gè)新的App項(xiàng)目,App開(kāi)發(fā)那邊提供殼子和部分系統(tǒng)級(jí)功能,所有的頁(yè)面由h5完成,考慮兼容性安卓4.1及ios7.1。全新的項(xiàng)目,沒(méi)有歷史包袱,就嘗試了新的開(kāi)發(fā)模式,采用了webpack + vue-c...
閱讀 2245·2021-11-17 09:33
閱讀 2785·2021-11-12 10:36
閱讀 3410·2021-09-27 13:47
閱讀 901·2021-09-22 15:10
閱讀 3498·2021-09-09 11:51
閱讀 1405·2021-08-25 09:38
閱讀 2765·2019-08-30 15:55
閱讀 2618·2019-08-30 15:53