摘要:它會代替所有的實例的值為,從而使知道那些判斷表達式總是錯誤的,從而刪除相關代碼,進一步壓縮打包文件模塊機制項目中使用的,通過也能通過打包有用的代碼,進一步減少大小。
好久沒寫文章,這次預計會帶來3篇的 Webpack 系列文章,將會在這幾天內更新完。
Webpack3 自今年6月20日正式發布而來,給我們帶來Scope Hoisting和Magic Comments兩大功能,可惜不在這次系列文章內容范疇里,而本次文章的主要內容是從項目中總結得到,當然也看了很多別人寫的文章,是可以被應用到生產中。這次主要介紹三個方面,分別是壓縮 JavaScript 和 CSS、配置環境變量、ES 模塊機制帶來的Tree-shaking。
假設我們有一個前端開發需求,這個需求有點特別,不是業務上的需求,而是要求減少文件的大小。可知這個需求算是性能優化上范疇,減少文件大小,加速網絡傳輸,縮短網頁加載時間,增加用戶體驗,提高用戶滿意度。這是一個正向結果,得干~
壓縮 JavaScript這里不得不提一下 Google 的 Closure Compiler,一款可以讓 JavaScript 下載與執行更快的工具,它的做法是執行一些"焦土"(scorched-earth)優化策略,它將函數展開,重寫變量名,過濾多余代碼,刪除從不會調用的函數,從而生成可能是最優化的代碼。如下
優化前
function map(array, iteratee) { let index = -1 const length = array == null ? 0 : array.length const result = new Array(length) while (++index < length) { result[index] = iteratee(array[index], index, array) } return result }
優化后
function map(n,e){let r=-1;for(const i=null==n?0:n.length,t=Array(i);++r對比發現優化效果極好,如果使用 UglifyJS 一樣可以達到相同的優化效果。由于 Webpack 內置這款插件,可以直接使用,配置如下
// webpack.config.js const webpack = require("webpack"); module.exports = { plugins: [ new webpack.optimize.UglifyJsPlugin() ] };使用該插件優化前后的對比結果如下說明:
假設我們有一段代碼,如下:
// comments.js import "./comments.css"; export function render(data, target) { console.log("Rendered!"); }Webpack 編譯之后的代碼大概如下:
// bundle.js (part of) "use strict"; Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); var __WEBPACK_IMPORTED_MODULE_0__comments_css__ = __webpack_require__(4); var __WEBPACK_IMPORTED_MODULE_0__comments_css___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__comments_css__); __webpack_exports__["render"] = render; function render(data, target) { console.log("Rendered!"); }如果使用了 UglifyJS 插件,重新編譯之后的代碼大概如下:
// bundle.js (part of) "use strict";function r(e,t){console.log("Rendered!")} Object.defineProperty(t,"__esModule",{value:!0}); var o=n(4);n.n(o);t.render=r特殊情況說明:目前,UglifyJS 2(Webpack自帶的) 是無法編譯 ES2015+ 的代碼,意味著如果代碼中是了類、箭頭函數或者其他新的特性,而且你沒有將代碼編譯為 ES5,那么 UglifyJS 插件是無法處理這些代碼的,這里提供兩種處理方法:
方法1:給 Webpack 添加支持 babel,基本過程如下
安裝 babel-core、babel-loader、babel-preset-es2015
npm i babel-core babel-loader babel-preset-es2015 --save-dev給 Webpack 添加配置信息
// webpack.config.js module.exports = { module: { rules: [ { test: /.js[x]$/, use: [{"babel-loader", options: { presets: ["es2015"] }] } ] } };方法2:使用 Babili 取代 UglifyJS 2,這是一款基于 Babel 的壓縮工具,更多了解查看 babili-webpack-plugin,這里不作太多的描述
壓縮 CSS壓縮 CSS 的方法比較簡單,css-loader 就自帶壓縮功能,配置如下:
// webpack.config.js module.exports = { module: { rules: [ { test: /.css$/, use: [ "style-loader", { loader: "css-loader", options: { minimize: true } } ] } ] } };另外我還寫過 Webpack 跟 Less 和 Sass 的配置教程,具體看:here1, here2
配置環境變量將NODE_ENV設置為production也能幫助減少前端項目大小
NODE_ENV通常作為環境變量被各種js框架或庫作為判斷條件去作為哪種執行模式,如開發模式或是生產模式,這些框架或者庫根據NODE_ENV的值去表現對應的行為。例如,當處于開發模式時,React 會做額外的檢測和打印警告:
// … if (process.env.NODE_ENV !== "production") { validateTypeDef(Constructor, propTypes, "prop"); } // …如果要打包構建項目到生產環境中,最好可以告訴項目中的框架或庫當前的環境變量是生產環境。對于適用于 Node.js 的庫來說,直接配置NODE_ENV為production即可,但對于 Web 端來說,可以使用 Webpack 自帶的插件實現對
process.env.NODE_ENV的設置,如下// webpack.config.js const webpack = require("webpack"); module.exports = { plugins: { new webpack.DefinePlugin({ "process.env.NODE_ENV": ""production"" }) } };DefinePlugin 允許我們創建全局變量,同時這些變量會作用于webpack的打包編譯期內。它會代替所有的process.env.NODE_ENV實例的值為"production",從而使 UglifyJS 知道那些判斷表達式總是錯誤的,從而刪除相關代碼,進一步壓縮打包文件
ECMAScript模塊機制項目中使用 ECMAScript 的import、export,Webpack 通過 tree-shaking 也能通過打包有用的代碼,進一步減少大小。 Tree-shaking 可以檢查整個打包依賴樹,找到使用的部分。所以如果使用 ECMAScript 模塊機制,Webpack 會去掉無用的代碼,如下:
假設寫了兩個文件,但只使用了其中一個文件
// comments.js export const commentRestEndpoint = "/rest/comments"; export const render = () => { return "Rendered!"; }; // index.js import { render } from "./a.js"; render();Webpack 知道componentRestEndpoint是沒有被使用,打包文件也不會有該入口
// bundle.js (part of) (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* unused harmony export commentRestEndpoint */ /* harmony export */__webpack_exports__["b"] = render; var commentRestEndpoint = "/rest/comments"; var render = function () { return "Rendered!"; } })UglifyJS 插件去掉無用部分
// bundle.js (part of) (function(n,e){"use strict";e.b=r;var r=function(){return"Rendered!"}})如果 JavaScript 框架或庫使用了 ECMAScript 模塊機制,那么 Tree-shaking 是對其也是有效滴
注意事項
1、 如果沒有 UglifyJS ,tree-shaking 將不作用
實際上,去掉無用的代碼不是 Webpack 本身,而是 UglifyJS。Webpack 只是去掉 export 表達式使那些 exports 不再使用,從而可以在壓縮的時候被去掉。因此,如果你打包的時候沒有使用壓縮,打包文件就不會變得更小
2、不要將 ES 模塊機制編譯為 CommonJS
如果你使用了 babel-preset-env 或 babel-preset-es2015,就需要檢查一下這些 preset 的配置了。默認情況下,它們都會ES 模塊機制的語法特性重新編譯為 CommonJS,如將 ES 的import和export編譯為 CommonJS 的require和module.exports。我們可以使用 { modules: false } 禁止編譯行為,如下:
// webpack.config.js module.exports = { module: { rules: [ { test: /.js[x]$/, use: [{"babel-loader", options: { presets: [["es2015", { modules: false }]] }] } ] } };3、在特殊條件下 Webpack 不會進行優化
當你使用了export * from "file.js" 或者是 TypeScript,Webpack 是不會進行優化。這些特殊條件在代碼中很難被發覺,也很難知道這些特殊條件的代碼是否被修復,更多了解可以查看 here
總結Webpack 對前端項目優化有很多種,這里提供了四種技巧,分別是通過 UglifyJS 插件實現對 JavaScript 文件的壓縮,css-loader 提供的壓縮功能,配置NODE_ENV可以進一步去掉無用代碼,tree-shaking幫助找到更多無用代碼
內容較多,大概就這樣~
文章首發于:https://www.linpx.com/p/webpa...
歡迎訪問我的博客:https://www.linpx.com
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/87338.html
摘要:這里要介紹的是工作流中的一種很普遍的代碼加工流程正常的業務邏輯開發流程需要經過預處理器如或,然后再經過后處理器如進行深加工。 還未看的,可以點擊查看上兩篇文章喲:Webpack 最佳實踐總結(一)、Webpack 最佳實踐總結(二) 好了,這篇是第三篇,也是完結篇,我感覺這一篇是最亂的一篇,湊合著看吧,不會讓你失望的 整合 CSS 加工流 有時候,前端項目中除了 JavaScript ...
摘要:這里要介紹的是工作流中的一種很普遍的代碼加工流程正常的業務邏輯開發流程需要經過預處理器如或,然后再經過后處理器如進行深加工。 還未看的,可以點擊查看上兩篇文章喲:Webpack 最佳實踐總結(一)、Webpack 最佳實踐總結(二) 好了,這篇是第三篇,也是完結篇,我感覺這一篇是最亂的一篇,湊合著看吧,不會讓你失望的 整合 CSS 加工流 有時候,前端項目中除了 JavaScript ...
摘要:默認做法是告訴瀏覽器這個文件的緩存時間,然后當文件內容被修改,則需要重命名該文件告訴瀏覽器需要重新下載和緩存,例如也能做類似的工作。 上一篇介紹了 Webpack 優化項目的四種技巧,分別是通過 UglifyJS 插件實現對 JavaScript 文件的壓縮,css-loader 提供的壓縮功能,配置NODE_ENV可以進一步去掉無用代碼,tree-shaking幫助找到更多無用代碼 ...
摘要:如果是在生產環境下,則加入插件,執行代碼壓縮,并且去除。規定了在開發環境下才使用。疑問目前為止,對于多頁面項目還是沒有找到一個很好的方案去構建自動化。原文可以看我的博客最佳實踐部署生產 tip webpack的入門篇可以看我的這一片博文。《如何使用webpack—webpack-howto》. 前言 最近一段時間在項目中使用了webpack和React來開發,總之來說也是遇到了許多坑,...
摘要:基本開發環境創建的項目,作為代碼編寫工具插件推薦插件配置文章目錄項目目錄結構介紹框架選擇處理請求二次封裝項目目錄結構簡介業務相關靜態文件全局組件基礎樣式布局樣式及工具引入請求配置路由全局狀態管理工具文件入口文件主要配置文件頁面檢查配置測試 基本開發環境 vue-cli3 創建的項目,vscode 作為代碼編寫工具vscode插件推薦:vscode 插件配置 文章目錄 項目目錄結構介紹...
閱讀 3563·2021-11-22 15:11
閱讀 4643·2021-11-18 13:15
閱讀 2710·2019-08-29 14:08
閱讀 3583·2019-08-26 13:49
閱讀 3100·2019-08-26 12:17
閱讀 3295·2019-08-26 11:54
閱讀 3119·2019-08-26 10:58
閱讀 2039·2019-08-26 10:21