成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

翻譯 | 上手 Webpack ? 這篇就夠了!

codercao / 1227人閱讀

摘要:最后,我們?cè)诳刂婆_(tái)中打印這個(gè)新數(shù)組。也可以借助簡(jiǎn)單的將其跑在瀏覽器上,之后可在控制臺(tái)中看到同樣的運(yùn)行結(jié)果。使用配置文件雖然會(huì)更占位置,但與此同時(shí)增加了可讀性,因?yàn)樗怯蓪?xiě)成的。例如,規(guī)定后綴的文件要先通過(guò)檢查,再通過(guò)把語(yǔ)法轉(zhuǎn)換為語(yǔ)法。

譯者:小 boy (滬江前端開(kāi)發(fā)工程師)
本文原創(chuàng),轉(zhuǎn)載請(qǐng)注明作者及出處。
原文地址:https://www.smashingmagazine....

JavaSript 模塊化打包已混跡江湖許久。2009年,RequireJS 就提交了它的第一個(gè)版本,Browserify 接踵而至,隨后其他打包工具也開(kāi)始大行其道。最終,Webpack 從其中脫穎而出。如果你對(duì)它不甚了解,希望我的文章能讓你上手這件強(qiáng)力打包工具。

什么是模塊化打包工具?

在大多數(shù)語(yǔ)言(JS 的最新版本 ECMAScript 2015+ 也支持,但并非支持所有瀏覽器)中,你可以將代碼拆分至多個(gè)文件,并且通過(guò)在業(yè)務(wù)代碼中引用這些文件來(lái)使用它們包含的方法??上У氖菫g覽器并不擁有這個(gè)能力。因此,模塊化打包工具應(yīng)運(yùn)而生,它以?xún)煞N形式為瀏覽器提供這個(gè)能力:1.異步加載模塊,并且在加載結(jié)束后運(yùn)行它們。2.將需要用到的文件拼湊成單一 JS 文件,最終在 HTML 中使用

假如你一直跟著做的話(huà),example5 分支便在此結(jié)束。不同插件傳入的參數(shù)或者配置項(xiàng)也大異其趣,其原因在于插件種類(lèi)繁多且涵蓋范圍廣闊,但殊途同歸的是,他們最終都會(huì)被添加到 webpack.config.jsplugins 數(shù)組中。同樣,也有其他方式可以處理 HTML 頁(yè)面的生成和文件名填充,一旦你開(kāi)始為打包后的文件添加清緩存哈希值(cache-busting hashes)后綴,這些事情就會(huì)變得非常簡(jiǎn)單。

觀察示例倉(cāng)庫(kù),你會(huì)發(fā)現(xiàn)有一個(gè) example6 分支,在該分支里我通過(guò)添加插件實(shí)現(xiàn)了 JS 代碼壓縮,但這不是必須的,除非你想改動(dòng) UglifyJS 配置。如果你不爽 UglifyJS 的默認(rèn)配置,可將倉(cāng)庫(kù)切換 (check out)至該分支下(只需要查看 webpack.config.js )去找到如何使用該插件并加以配置。但如果默認(rèn)配置正合你意,你只需要在命令行運(yùn)行 webpack 時(shí)傳入 -p 參數(shù)。該參數(shù)是 production 的簡(jiǎn)寫(xiě),與使用 --optimize-minimize--optimize-occurence-order 參數(shù)的效果一樣,前者用以壓縮 JS 代碼,后者用以?xún)?yōu)化已引入模塊的順序,著眼于稍小的文件尺寸和稍快的執(zhí)行速度。在示例倉(cāng)庫(kù)完成一段時(shí)間后我才知道 -p 這個(gè)參數(shù),所以我決定保存該插件示例,可以用來(lái)提醒你還有更簡(jiǎn)單的方法(除了添加插件之外)。另一可供使用的快捷命令參數(shù)是 -d-d 會(huì)展示更多 Webpack 打印出的信息,并且可不借助其他參數(shù)生成資料圖(source map)。還有很多其他命令行快捷參數(shù)可供使用。

懶加載數(shù)據(jù)塊

懶加載(lazy-loading)模塊是我在 RequireJS 中用得舒適但在 Browserify 中難以工作的模塊。一個(gè)頗具規(guī)模的 JS 文件固然可以從減少網(wǎng)絡(luò)請(qǐng)求中受益,但也幾乎坐實(shí)了在一次會(huì)話(huà)中,某些用戶(hù)不必用到的代碼會(huì)被下載下來(lái)。

Webpack 可以將打包文件拆分成可被懶加載的若干塊(chunks),而且還不需要任何配置。你僅需要從兩種書(shū)寫(xiě)方式中挑一種來(lái)書(shū)寫(xiě)代碼,剩下的則交給 Webpack。這兩種方式其一基于 CommonJS ,其二則基于 AMD。如果使用前者懶加載,需要這樣寫(xiě):

require.ensure(["module-a", "module-b"], function(require) {
    var a = require("module-a");
    var b = require("module-b");
    // …
});

require.ensure 需要確保模塊是可用的(但并非運(yùn)行模塊),然后傳入一個(gè)由模塊名構(gòu)成的數(shù)組,接著傳入一個(gè)回調(diào)函數(shù)(callback)。真正想要在回調(diào)函數(shù)里使用模塊,你需要顯式 require 數(shù)組里傳入的相應(yīng)模塊。

私以為這種方式相麻煩,所以,我們來(lái)看 AMD 的寫(xiě)法。

require(["module-a", "module-b"], function(a, b) {
    // …
});

AMD 模式下,使用 require 函數(shù),傳入包含依賴(lài)模塊名的數(shù)組,接著再傳入回調(diào)函數(shù)。該回調(diào)函數(shù)的參數(shù)就是依賴(lài)模塊的引用,它們的排列順序與依賴(lài)模塊在數(shù)組中的排列順序相同。

Webpack 2 同時(shí)也支持 System.import,其借助于 promises 而非回調(diào)函數(shù)。盡管將回調(diào)內(nèi)容包裹在 promise 下并非難事,但我仍以為該提升非常有用。不過(guò)需要注意的是, System.import 現(xiàn)已過(guò)時(shí),較新的規(guī)范推薦使用 import()。不過(guò),這里告誡一下, Babel (以及 TypeScript)會(huì)在你使用System.import的時(shí)候拋出語(yǔ)法異常。你可以借助于 babel-plugin-dynamic-import-webpack 插件,但該插件將會(huì)將其轉(zhuǎn)化為 require.ensure,而不是讓 Babel 合法處理新 import 或者任之由 Webpack 處置。我認(rèn)為 AMD 或 require.ensure 在很久之后才會(huì)被棄置,且 Webpack 直到第三個(gè)版本才會(huì)支持 System.import ,那還遠(yuǎn)著呢,所以用你順眼的那個(gè)就好了。

擴(kuò)充我們的代碼,令其停滯兩秒,然后再將 Handlebars 模板懶加載進(jìn)來(lái)并輸出到屏幕上。為此,我們移除頂部 import 模板的語(yǔ)句,然后將最后一行包裹到 setTimeout 和 AMD 模式的 require 中引入模板。

運(yùn)行 npm start ,你會(huì)發(fā)現(xiàn)生成了另外一個(gè)名為 1.bundle.js 的資源文件(asset)。在瀏覽器打開(kāi)該頁(yè)面,然后在開(kāi)發(fā)者工具中監(jiān)聽(tīng)網(wǎng)絡(luò)流量,2秒之后你會(huì)發(fā)現(xiàn)新的資源文件最終被加載并且運(yùn)行了。以上這些實(shí)現(xiàn)起來(lái)并不困難,但提升用戶(hù)體驗(yàn)可不止一點(diǎn)。

注意,這些二級(jí)打包文件(sub-bundles)或曰數(shù)據(jù)塊(chunks),內(nèi)部囊括了他們的所有依賴(lài)模塊(dependencies),但不包含其主數(shù)據(jù)塊(parent chunks)已引入的依賴(lài)模塊。(你可以有多個(gè)入口文件,每個(gè)都懶加載一個(gè)數(shù)據(jù)塊,因此該數(shù)據(jù)塊在其主數(shù)據(jù)塊中加載的依賴(lài)模塊也會(huì)不同。)

創(chuàng)建公共庫(kù)數(shù)據(jù)塊 (Vendor Chunk)

我們?cè)僬f(shuō)一個(gè)優(yōu)化的點(diǎn):公共庫(kù)數(shù)據(jù)塊。你可以定義一個(gè)多帶帶用以打包的 bundle,該 bundle 中存放不常改動(dòng)的 “common” 庫(kù)或第三方代碼。該策略可使用戶(hù)獨(dú)立緩存你的公共庫(kù)文件,以區(qū)別于業(yè)務(wù)代碼,以便在你迭代應(yīng)用時(shí)讓用戶(hù)無(wú)需重新下載該庫(kù)文件。

為此,我們使用 Webpack 官方插件:CommonsChunkPlugin。它已附帶在 Webpack 中,所以我們無(wú)需安裝。僅對(duì) 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"
        })
    ]
};

我們?cè)诘谌幸朐摬寮?。此后,?entry 部分修改配置,將其換成了一個(gè)對(duì)象字面量(literal),用以指定多入口。vendor 入口記錄了會(huì)在公共庫(kù)數(shù)據(jù)塊中——這里包含了 polyfill 和 Lodash ——被引入的庫(kù)并將我們的主要入口放置在 main 入口里。接著,我們僅需將 CommonsChunkPlugin 添加到 plugins 部分,指定 “vendor” 數(shù)據(jù)塊作為該插件生成數(shù)據(jù)塊的索引,同時(shí)指定 vendor.bundle.js 文件用以存放公共庫(kù)代碼(譯者注:這里插件配置中的 name: "vendor" 對(duì)應(yīng) entry 中的 vendor 入口,入口數(shù)組中指定的依賴(lài)模塊即最終存放于 vendor.bundle.js 文件中的依賴(lài)模塊)。

通過(guò)指定 “vendor” 數(shù)據(jù)塊,該插件將拉取此數(shù)據(jù)塊所有的依賴(lài)模塊,并將其存放于公共庫(kù)數(shù)據(jù)塊內(nèi),這些依賴(lài)模塊在一個(gè)多帶帶入口文件里被指定。如果不在入口對(duì)象字面量中指定數(shù)據(jù)塊名,插件會(huì)基于多入口文件之間公用的依賴(lài)模塊來(lái)生成獨(dú)立文件。

運(yùn)行 Webpack ,你將看到3份 JS 文件:bundle.js, 1.bundle.jsvendor.bundle.js。如果愿意的話(huà)也可以運(yùn)行 npm start 命令來(lái)在瀏覽器中查看結(jié)果。看起來(lái) Webpack 甚至?xí)炎陨砑虞d不同模塊的主要代碼放進(jìn)公共庫(kù)數(shù)據(jù)塊,此舉極為實(shí)用。

至此我們結(jié)束了 example8 分支之旅,同時(shí)本篇教程也接近尾聲。我所談?lì)H多,但僅讓你對(duì) Webpack 的能力淺嘗輒止。Webpack 實(shí)現(xiàn)了更簡(jiǎn)便的 CSS module、清緩存、圖片優(yōu)化等等很多事情——多到即便書(shū)巨著一本,我也無(wú)法說(shuō)窮道盡,且在我成書(shū)之前,大多數(shù)已寫(xiě)的內(nèi)容也將被更新替代。So,嘗試一下 Webpack 吧,且告訴我它有沒(méi)有提升工作流。祝吾主保佑,編程愉快!


iKcamp原創(chuàng)新書(shū)《移動(dòng)Web前端高效開(kāi)發(fā)實(shí)戰(zhàn)》已在亞馬遜、京東、當(dāng)當(dāng)開(kāi)售。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/85056.html

相關(guān)文章

  • JS正則表達(dá)式入門(mén),看這篇夠了

    摘要:如果遇到非常的復(fù)雜的匹配,正則表達(dá)式的優(yōu)勢(shì)就更加明顯了。關(guān)于正則表達(dá)式書(shū)寫(xiě)規(guī)則,可查看,上面說(shuō)的很清楚了,我就不貼出來(lái)了。替換與正則表達(dá)式匹配的子串,并返回替換后的字符串。結(jié)語(yǔ)正則表達(dá)式并不難,懂了其中的套路之后,一切都變得簡(jiǎn)單了。 前言 在正文開(kāi)始前,先說(shuō)說(shuō)正則表達(dá)式是什么,為什么要用正則表達(dá)式?正則表達(dá)式在我個(gè)人看來(lái)就是一個(gè)瀏覽器可以識(shí)別的規(guī)則,有了這個(gè)規(guī)則,瀏覽器就可以幫我們判斷...

    wenzi 評(píng)論0 收藏0
  • 2017-08-31 前端日?qǐng)?bào)

    摘要:前端日?qǐng)?bào)精選從化的探討體會(huì)團(tuán)隊(duì)設(shè)計(jì)思想導(dǎo)致的跨站漏洞在餓了么前端的實(shí)踐還是你應(yīng)該選擇哪一個(gè)前端框架上手這篇就夠了中文網(wǎng)格布局入門(mén)上最流行的項(xiàng)目眾成翻譯的入門(mén)教程眾成翻譯開(kāi)發(fā),在中配置眾成翻譯組件間的樣式污染掘金核心模塊之 2017-08-31 前端日?qǐng)?bào) 精選 從 setState promise 化的探討 體會(huì) React 團(tuán)隊(duì)設(shè)計(jì)思想jQuery導(dǎo)致的XSS跨站漏洞Weex 在餓了么...

    liuhh 評(píng)論0 收藏0
  • 庫(kù),組件,框架 - 收藏集 - 掘金

    摘要:哈哈,我理解,架構(gòu)就是骨架,如下圖所示譯年月個(gè)有趣的和庫(kù)前端掘金我們創(chuàng)辦的使命是讓你及時(shí)的了解開(kāi)發(fā)中最新最酷的趨勢(shì)。 翻譯 | 上手 Webpack ? 這篇就夠了! - 掘金譯者:小 boy (滬江前端開(kāi)發(fā)工程師) 本文原創(chuàng),轉(zhuǎn)載請(qǐng)注明作者及出處。 原文地址:https://www.smashingmagazine.... JavaSrip... 讀 Zepto 源碼之代碼結(jié)構(gòu) - ...

    tommego 評(píng)論0 收藏0
  • Lombok 看這篇夠了

    摘要:注解在類(lèi)上為類(lèi)提供一個(gè)全參的構(gòu)造方法,加了這個(gè)注解后,類(lèi)中不提供默認(rèn)構(gòu)造方法了。這個(gè)注解用在類(lèi)上,使用類(lèi)中所有帶有注解的或者帶有修飾的成員變量生成對(duì)應(yīng)的構(gòu)造方法。 轉(zhuǎn)載請(qǐng)注明原創(chuàng)地址:http://www.54tianzhisheng.cn/2018/01/07/lombok/ showImg(http://ohfk1r827.bkt.clouddn.com/blog/180107/7...

    LeanCloud 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<