摘要:最后,我們在控制臺中打印這個新數(shù)組。也可以借助簡單的將其跑在瀏覽器上,之后可在控制臺中看到同樣的運(yùn)行結(jié)果。使用配置文件雖然會更占位置,但與此同時增加了可讀性,因為它是由寫成的。例如,規(guī)定后綴的文件要先通過檢查,再通過把語法轉(zhuǎn)換為語法。
譯者:小 boy (滬江前端開發(fā)工程師)
本文原創(chuàng),轉(zhuǎn)載請注明作者及出處。
原文地址:https://www.smashingmagazine....
JavaSript 模塊化打包已混跡江湖許久。2009年,RequireJS 就提交了它的第一個版本,Browserify 接踵而至,隨后其他打包工具也開始大行其道。最終,Webpack 從其中脫穎而出。如果你對它不甚了解,希望我的文章能讓你上手這件強(qiáng)力打包工具。
什么是模塊化打包工具?在大多數(shù)語言(JS 的最新版本 ECMAScript 2015+ 也支持,但并非支持所有瀏覽器)中,你可以將代碼拆分至多個文件,并且通過在業(yè)務(wù)代碼中引用這些文件來使用它們包含的方法。可惜的是瀏覽器并不擁有這個能力。因此,模塊化打包工具應(yīng)運(yùn)而生,它以兩種形式為瀏覽器提供這個能力:1.異步加載模塊,并且在加載結(jié)束后運(yùn)行它們。2.將需要用到的文件拼湊成單一 JS 文件,最終在 HTML 中使用
假如你一直跟著做的話,example5 分支便在此結(jié)束。不同插件傳入的參數(shù)或者配置項也大異其趣,其原因在于插件種類繁多且涵蓋范圍廣闊,但殊途同歸的是,他們最終都會被添加到 webpack.config.js 的 plugins 數(shù)組中。同樣,也有其他方式可以處理 HTML 頁面的生成和文件名填充,一旦你開始為打包后的文件添加清緩存哈希值(cache-busting hashes)后綴,這些事情就會變得非常簡單。
觀察示例倉庫,你會發(fā)現(xiàn)有一個 example6 分支,在該分支里我通過添加插件實現(xiàn)了 JS 代碼壓縮,但這不是必須的,除非你想改動 UglifyJS 配置。如果你不爽 UglifyJS 的默認(rèn)配置,可將倉庫切換 (check out)至該分支下(只需要查看 webpack.config.js )去找到如何使用該插件并加以配置。但如果默認(rèn)配置正合你意,你只需要在命令行運(yùn)行 webpack 時傳入 -p 參數(shù)。該參數(shù)是 production 的簡寫,與使用 --optimize-minimize 和 --optimize-occurence-order 參數(shù)的效果一樣,前者用以壓縮 JS 代碼,后者用以優(yōu)化已引入模塊的順序,著眼于稍小的文件尺寸和稍快的執(zhí)行速度。在示例倉庫完成一段時間后我才知道 -p 這個參數(shù),所以我決定保存該插件示例,可以用來提醒你還有更簡單的方法(除了添加插件之外)。另一可供使用的快捷命令參數(shù)是 -d ,-d 會展示更多 Webpack 打印出的信息,并且可不借助其他參數(shù)生成資料圖(source map)。還有很多其他命令行快捷參數(shù)可供使用。
懶加載數(shù)據(jù)塊懶加載(lazy-loading)模塊是我在 RequireJS 中用得舒適但在 Browserify 中難以工作的模塊。一個頗具規(guī)模的 JS 文件固然可以從減少網(wǎng)絡(luò)請求中受益,但也幾乎坐實了在一次會話中,某些用戶不必用到的代碼會被下載下來。
Webpack 可以將打包文件拆分成可被懶加載的若干塊(chunks),而且還不需要任何配置。你僅需要從兩種書寫方式中挑一種來書寫代碼,剩下的則交給 Webpack。這兩種方式其一基于 CommonJS ,其二則基于 AMD。如果使用前者懶加載,需要這樣寫:
require.ensure(["module-a", "module-b"], function(require) { var a = require("module-a"); var b = require("module-b"); // … });
require.ensure 需要確保模塊是可用的(但并非運(yùn)行模塊),然后傳入一個由模塊名構(gòu)成的數(shù)組,接著傳入一個回調(diào)函數(shù)(callback)。真正想要在回調(diào)函數(shù)里使用模塊,你需要顯式 require 數(shù)組里傳入的相應(yīng)模塊。
私以為這種方式相麻煩,所以,我們來看 AMD 的寫法。
require(["module-a", "module-b"], function(a, b) { // … });
AMD 模式下,使用 require 函數(shù),傳入包含依賴模塊名的數(shù)組,接著再傳入回調(diào)函數(shù)。該回調(diào)函數(shù)的參數(shù)就是依賴模塊的引用,它們的排列順序與依賴模塊在數(shù)組中的排列順序相同。
Webpack 2 同時也支持 System.import,其借助于 promises 而非回調(diào)函數(shù)。盡管將回調(diào)內(nèi)容包裹在 promise 下并非難事,但我仍以為該提升非常有用。不過需要注意的是, System.import 現(xiàn)已過時,較新的規(guī)范推薦使用 import()。不過,這里告誡一下, Babel (以及 TypeScript)會在你使用System.import的時候拋出語法異常。你可以借助于 babel-plugin-dynamic-import-webpack 插件,但該插件將會將其轉(zhuǎn)化為 require.ensure,而不是讓 Babel 合法處理新 import 或者任之由 Webpack 處置。我認(rèn)為 AMD 或 require.ensure 在很久之后才會被棄置,且 Webpack 直到第三個版本才會支持 System.import ,那還遠(yuǎn)著呢,所以用你順眼的那個就好了。
擴(kuò)充我們的代碼,令其停滯兩秒,然后再將 Handlebars 模板懶加載進(jìn)來并輸出到屏幕上。為此,我們移除頂部 import 模板的語句,然后將最后一行包裹到 setTimeout 和 AMD 模式的 require 中引入模板。
運(yùn)行 npm start ,你會發(fā)現(xiàn)生成了另外一個名為 1.bundle.js 的資源文件(asset)。在瀏覽器打開該頁面,然后在開發(fā)者工具中監(jiān)聽網(wǎng)絡(luò)流量,2秒之后你會發(fā)現(xiàn)新的資源文件最終被加載并且運(yùn)行了。以上這些實現(xiàn)起來并不困難,但提升用戶體驗可不止一點(diǎn)。
注意,這些二級打包文件(sub-bundles)或曰數(shù)據(jù)塊(chunks),內(nèi)部囊括了他們的所有依賴模塊(dependencies),但不包含其主數(shù)據(jù)塊(parent chunks)已引入的依賴模塊。(你可以有多個入口文件,每個都懶加載一個數(shù)據(jù)塊,因此該數(shù)據(jù)塊在其主數(shù)據(jù)塊中加載的依賴模塊也會不同。)
創(chuàng)建公共庫數(shù)據(jù)塊 (Vendor Chunk)我們再說一個優(yōu)化的點(diǎn):公共庫數(shù)據(jù)塊。你可以定義一個多帶帶用以打包的 bundle,該 bundle 中存放不常改動的 “common” 庫或第三方代碼。該策略可使用戶獨(dú)立緩存你的公共庫文件,以區(qū)別于業(yè)務(wù)代碼,以便在你迭代應(yīng)用時讓用戶無需重新下載該庫文件。
為此,我們使用 Webpack 官方插件:CommonsChunkPlugin。它已附帶在 Webpack 中,所以我們無需安裝。僅對 webpack.config.js 稍作修改即可:
var HtmlwebpackPlugin = require("html-webpack-plugin"); var UglifyJsPlugin = require("webpack/lib/optimize/UglifyJsPlugin"); var CommonsChunkPlugin = require("webpack/lib/optimize/CommonsChunkPlugin"); module.exports = { entry: { vendor: ["babel-polyfill", "lodash"], main: "./src/main.js" }, output: { path: "./dist", filename: "bundle.js" }, module: { rules: [ { test: /.jsx?$/, loader: "babel-loader", exclude: /node_modules/, options: { plugins: ["transform-runtime"], presets: ["es2015"] } }, { test: /.hbs$/, loader: "handlebars-loader" } ] }, plugins: [ new HtmlwebpackPlugin({ title: "Intro to webpack", template: "src/index.html" }), new UglifyJsPlugin({ beautify: false, mangle: { screw_ie8 : true }, compress: { screw_ie8: true, warnings: false }, comments: false }), new CommonsChunkPlugin({ name: "vendor", filename: "vendor.bundle.js" }) ] };
我們在第三行引入該插件。此后,在 entry 部分修改配置,將其換成了一個對象字面量(literal),用以指定多入口。vendor 入口記錄了會在公共庫數(shù)據(jù)塊中——這里包含了 polyfill 和 Lodash ——被引入的庫并將我們的主要入口放置在 main 入口里。接著,我們僅需將 CommonsChunkPlugin 添加到 plugins 部分,指定 “vendor” 數(shù)據(jù)塊作為該插件生成數(shù)據(jù)塊的索引,同時指定 vendor.bundle.js 文件用以存放公共庫代碼(譯者注:這里插件配置中的 name: "vendor" 對應(yīng) entry 中的 vendor 入口,入口數(shù)組中指定的依賴模塊即最終存放于 vendor.bundle.js 文件中的依賴模塊)。
通過指定 “vendor” 數(shù)據(jù)塊,該插件將拉取此數(shù)據(jù)塊所有的依賴模塊,并將其存放于公共庫數(shù)據(jù)塊內(nèi),這些依賴模塊在一個多帶帶入口文件里被指定。如果不在入口對象字面量中指定數(shù)據(jù)塊名,插件會基于多入口文件之間公用的依賴模塊來生成獨(dú)立文件。
運(yùn)行 Webpack ,你將看到3份 JS 文件:bundle.js, 1.bundle.js 和 vendor.bundle.js。如果愿意的話也可以運(yùn)行 npm start 命令來在瀏覽器中查看結(jié)果。看起來 Webpack 甚至?xí)炎陨砑虞d不同模塊的主要代碼放進(jìn)公共庫數(shù)據(jù)塊,此舉極為實用。
至此我們結(jié)束了 example8 分支之旅,同時本篇教程也接近尾聲。我所談頗多,但僅讓你對 Webpack 的能力淺嘗輒止。Webpack 實現(xiàn)了更簡便的 CSS module、清緩存、圖片優(yōu)化等等很多事情——多到即便書巨著一本,我也無法說窮道盡,且在我成書之前,大多數(shù)已寫的內(nèi)容也將被更新替代。So,嘗試一下 Webpack 吧,且告訴我它有沒有提升工作流。祝吾主保佑,編程愉快!
iKcamp原創(chuàng)新書《移動Web前端高效開發(fā)實戰(zhàn)》已在亞馬遜、京東、當(dāng)當(dāng)開售。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/85056.html
摘要:如果遇到非常的復(fù)雜的匹配,正則表達(dá)式的優(yōu)勢就更加明顯了。關(guān)于正則表達(dá)式書寫規(guī)則,可查看,上面說的很清楚了,我就不貼出來了。替換與正則表達(dá)式匹配的子串,并返回替換后的字符串。結(jié)語正則表達(dá)式并不難,懂了其中的套路之后,一切都變得簡單了。 前言 在正文開始前,先說說正則表達(dá)式是什么,為什么要用正則表達(dá)式?正則表達(dá)式在我個人看來就是一個瀏覽器可以識別的規(guī)則,有了這個規(guī)則,瀏覽器就可以幫我們判斷...
摘要:前端日報精選從化的探討體會團(tuán)隊設(shè)計思想導(dǎo)致的跨站漏洞在餓了么前端的實踐還是你應(yīng)該選擇哪一個前端框架上手這篇就夠了中文網(wǎng)格布局入門上最流行的項目眾成翻譯的入門教程眾成翻譯開發(fā),在中配置眾成翻譯組件間的樣式污染掘金核心模塊之 2017-08-31 前端日報 精選 從 setState promise 化的探討 體會 React 團(tuán)隊設(shè)計思想jQuery導(dǎo)致的XSS跨站漏洞Weex 在餓了么...
摘要:哈哈,我理解,架構(gòu)就是骨架,如下圖所示譯年月個有趣的和庫前端掘金我們創(chuàng)辦的使命是讓你及時的了解開發(fā)中最新最酷的趨勢。 翻譯 | 上手 Webpack ? 這篇就夠了! - 掘金譯者:小 boy (滬江前端開發(fā)工程師) 本文原創(chuàng),轉(zhuǎn)載請注明作者及出處。 原文地址:https://www.smashingmagazine.... JavaSrip... 讀 Zepto 源碼之代碼結(jié)構(gòu) - ...
摘要:注解在類上為類提供一個全參的構(gòu)造方法,加了這個注解后,類中不提供默認(rèn)構(gòu)造方法了。這個注解用在類上,使用類中所有帶有注解的或者帶有修飾的成員變量生成對應(yīng)的構(gòu)造方法。 轉(zhuǎn)載請注明原創(chuàng)地址:http://www.54tianzhisheng.cn/2018/01/07/lombok/ showImg(http://ohfk1r827.bkt.clouddn.com/blog/180107/7...
閱讀 1335·2021-09-01 10:30
閱讀 2263·2021-07-23 10:38
閱讀 969·2019-08-29 15:06
閱讀 3215·2019-08-29 13:53
閱讀 3325·2019-08-26 11:54
閱讀 1901·2019-08-26 11:38
閱讀 2436·2019-08-26 10:29
閱讀 3190·2019-08-23 18:15