亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

codercao / 1272人閱讀

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

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

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

什么是模塊化打包工具?

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

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

觀察示例倉庫,你會(huì)發(fā)現(xiàn)有一個(gè) example6 分支,在該分支里我通過添加插件實(shí)現(xiàn)了 JS 代碼壓縮,但這不是必須的,除非你想改動(dòng) UglifyJS 配置。如果你不爽 UglifyJS 的默認(rèn)配置,可將倉庫切換 (check out)至該分支下(只需要查看 webpack.config.js )去找到如何使用該插件并加以配置。但如果默認(rèn)配置正合你意,你只需要在命令行運(yùn)行 webpack 時(shí)傳入 -p 參數(shù)。該參數(shù)是 production 的簡(jiǎn)寫,與使用 --optimize-minimize--optimize-occurence-order 參數(shù)的效果一樣,前者用以壓縮 JS 代碼,后者用以優(yōu)化已引入模塊的順序,著眼于稍小的文件尺寸和稍快的執(zhí)行速度。在示例倉庫完成一段時(shí)間后我才知道 -p 這個(gè)參數(shù),所以我決定保存該插件示例,可以用來提醒你還有更簡(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ì)被下載下來。

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è)由模塊名構(gòu)成的數(shù)組,接著傳入一個(gè)回調(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 同時(shí)也支持 System.import,其借助于 promises 而非回調(diào)函數(shù)。盡管將回調(diào)內(nèi)容包裹在 promise 下并非難事,但我仍以為該提升非常有用。不過需要注意的是, System.import 現(xiàn)已過時(shí),較新的規(guī)范推薦使用 import()。不過,這里告誡一下, Babel (以及 TypeScript)會(huì)在你使用System.import的時(shí)候拋出語法異常。你可以借助于 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)來并輸出到屏幕上。為此,我們移除頂部 import 模板的語句,然后將最后一行包裹到 setTimeout 和 AMD 模式的 require 中引入模板。

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

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

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

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

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

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

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

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


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

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

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

相關(guān)文章

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

    摘要:如果遇到非常的復(fù)雜的匹配,正則表達(dá)式的優(yōu)勢(shì)就更加明顯了。關(guān)于正則表達(dá)式書寫規(guī)則,可查看,上面說的很清楚了,我就不貼出來了。替換與正則表達(dá)式匹配的子串,并返回替換后的字符串。結(jié)語正則表達(dá)式并不難,懂了其中的套路之后,一切都變得簡(jiǎn)單了。 前言 在正文開始前,先說說正則表達(dá)式是什么,為什么要用正則表達(dá)式?正則表達(dá)式在我個(gè)人看來就是一個(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)格布局入門上最流行的項(xiàng)目眾成翻譯的入門教程眾成翻譯開發(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
  • 庫,組件,框架 - 收藏集 - 掘金

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

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

    摘要:注解在類上為類提供一個(gè)全參的構(gòu)造方法,加了這個(gè)注解后,類中不提供默認(rèn)構(gòu)造方法了。這個(gè)注解用在類上,使用類中所有帶有注解的或者帶有修飾的成員變量生成對(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元查看
<