国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Webpack 最佳實(shí)踐總結(jié)(三)

jerryloveemily / 3060人閱讀

摘要:這里要介紹的是工作流中的一種很普遍的代碼加工流程正常的業(yè)務(wù)邏輯開發(fā)流程需要經(jīng)過預(yù)處理器如或,然后再經(jīng)過后處理器如進(jìn)行深加工。

還未看的,可以點(diǎn)擊查看上兩篇文章喲:Webpack 最佳實(shí)踐總結(jié)(一)、Webpack 最佳實(shí)踐總結(jié)(二)

好了,這篇是第三篇,也是完結(jié)篇,我感覺這一篇是最亂的一篇,湊合著看吧,不會(huì)讓你失望的

整合 CSS 加工流

有時(shí)候,前端項(xiàng)目中除了 JavaScript 外,還有一個(gè)更重要的 CSS 需要我們花點(diǎn)精力進(jìn)去。這里主要陳述一下如何將 CSS 加工流整合到 webpack 中,因?yàn)?CSS Modules 的情況比較復(fù)雜,所有暫還未打算介紹更多關(guān)于 CSS Modules 的內(nèi)容

CSS 工作流指什么?好的工作流可以提供開發(fā)效率,節(jié)約開發(fā)成本。這里要介紹的是 CSS 工作流中的一種很普遍的代碼加工流程:正常的 CSS 業(yè)務(wù)邏輯開發(fā)流程需要經(jīng)過 CSS 預(yù)處理器(如 Sass 或 Less),然后再經(jīng)過后處理器(如 PostCSS)進(jìn)行深加工。Sass 和 less 讓我們吃上"語(yǔ)法糖"去快捷編寫 CSS,PostCSS 可以讓我們不再關(guān)心每條語(yǔ)句是否兼顧不同和不同版本的瀏覽器

在 webpack 上整合 CSS 加工流實(shí)現(xiàn)方式如下:

配置預(yù)處理器

這里以 Sass 作為預(yù)處理器,如下:

// webpack.config.js
const webpack = require("webpack");
const ExtractTextPlugin = require("extract-text-webpack-plugin");

module.exports = {
  module: {
    rules: [
      // ...
      {
        test: /.scss$/,
        exclude: /node_modules/,
        use: ExtractTextPlugin.extract({
          fallback: "style-loader",
          use: [
            { loader: "css-loader", options: { minimize: true } },
            "postcss-loader",
            "sass-loader"
          ]
        })
      }
    ]
  }
}

配置后處理器

這里以 PostCSS 作為后處理器,如下:

// webpack.config.js
const webpack = require("webpack");
const autoprefixer = require("autoprefixer");

module.exports = {
  plugins: [
    new webpack.LoaderOptionsPlugin({
      options: {
        postcss: [
          autoprefixer({
            browsers: [
              "last 3 version",
              "ie >= 10"
            ]
          })
        ],
        context: staticSourcePath
      }
    })
  ]
}

設(shè)置外聯(lián)

// webpack.config.js
const ExtractTextPlugin = require("extract-text-webpack-plugin");

// 存放靜態(tài)資源,諸如圖片或者是 normalize.css
const staticSourcePath = path.join(__dirname, "static");

module.exports = {
  // ...
  entry: {
    // 設(shè)置入口文件,順序是靜態(tài)資源 -> custom.scss -> 項(xiàng)目里其他 scss
    base: path.resolve(staticSourcePath, "src/public/custom.scss")
  },
  // ...
  plugins: [
    // 創(chuàng)建  標(biāo)簽,并將 src 指向最終生成的 CSS 文件,需要 html-webpack-plugin
    new ExtractTextPlugin({
      filename: "[name].[contenthash].css",
      allChunks: true
    })
  ]
}
壓縮第三方庫(kù)

以 Moment.js 和 Lodash 為例

Moment.js

Moment.js(v2.18.1) 是一個(gè)用于日期的 JavaScript 庫(kù),默認(rèn)情況下,只有你安裝它到你的項(xiàng)目中,即使壓縮后,也會(huì)占據(jù)217kb大小。相對(duì)于在2017年8月1日的統(tǒng)計(jì),對(duì)比與 JavaScript 的 446kb 的平均大小,這是實(shí)在是太大了。不過 webpack 可以去掉 Moment.js 其中無用的代碼。

其中有 165kb 的大小是用于本地化的語(yǔ)言包,即便你不去用它們,它們?cè)谀J(rèn)的情況下也會(huì)被包含進(jìn)來。如下代碼來自 moment 的 gitihub

// moment/src/lib/locale/locales.js
function loadLocale(name) {
    var oldLocale = null;
    // TODO: Find a better way to register and load all the locales in Node
    if (!locales[name] && (typeof module !== "undefined") &&
            module && module.exports) {
        try {
            oldLocale = globalLocale._abbr;
            require("./locale/" + name);
            // because defineLocale currently also sets the global locale, we
            // want to undo that for lazy loaded locales
            getSetGlobalLocale(oldLocale);
        } catch (e) { }
    }
    return locales[name];
}

上面的代碼會(huì)使 Moment.js 在運(yùn)行期間動(dòng)態(tài)地選擇相應(yīng)文件去加載。

要解決它需要用到 ContextReplacementPlugin,一款替換上下文的插件,例子如下:

// webpack.config.js
const webpack = require("webpack");

module.exports = {
  plugins: [
    new webpack.ContextReplacementPlugin(
      // 需要被處理的文件目錄位置
      /moment[/]locale/,
      // 正則匹配需要被包括進(jìn)來的文件
      /(en|zh-cn).js/
    )
  ]
};
Lodash

Lodash 是一款方便開發(fā) JavaScript 的工具集合,測(cè)試版本為4.17.4。

當(dāng)你項(xiàng)目包含有 Lodash 的時(shí)候,你打包出來的文件至少增加 75kb,多出來的大小包含了 316 個(gè) Lodash 的函數(shù)。如果你只是使用了其中少數(shù),例如 20 個(gè),那么大概有 65 kb 是多余的。下面將列出兩種去掉這些多余的代碼的方法:

方法1:

還記得 webpack最佳實(shí)踐(一) 提及的 Tree-shaking 嗎?正因?yàn)橛兴覀兛梢岳眠@個(gè)特性非常容易做到按需引用,如下:

import _ from "lodash";
_.get();

修改為

import get from "lodash/get";
get();

代碼量從 72kb 壓縮到 8.27kb

方法2:

方法1只適合剛開始玩一個(gè)項(xiàng)目的時(shí)候,并不怎么適合玩開了的項(xiàng)目,除非重寫一次,這工作量太大了,另外一個(gè)原因是 lodash 的方法名會(huì)容易跟自定義的函數(shù)名沖突,造成隱藏性bug。方法2就是解決這兩個(gè)問題,那就是使用babel-plugin-lodash

babel-plugin-lodash 是一款通過 babel 去實(shí)現(xiàn)將 lodash 的import用法編譯為最佳實(shí)踐的插件,配置如下:

打開.babelrc,添加下面配置

{
  "plugins": ["lodash"]
}

更多的配置方式可以查看文檔,這里不再作太多介紹。更具體的優(yōu)化效果看下面:

import _ from "lodash";
_.get({ a: { b: 5 } }, "a.b");

上面的代碼是沒有使用babel-plugin-lodash,使用之后,會(huì)被重新編譯為下面:

import _get from "lodash/get";
_get({ a: { b: 5 } }, "a.b");

跟方法1一樣,代碼量從 72kb 壓縮到 8.27kb

當(dāng)然如果你想更進(jìn)一步壓縮代碼,可以嘗試與lodash-webpack-plugin搭配,它會(huì)更深一步地去刪除一些lodash的方法里的代碼。例如_.get默認(rèn)支持深路徑查詢,如果你不需要支持深路徑查詢,你可以開啟這個(gè)插件,這個(gè)方法就會(huì)被去掉這個(gè)支持:

只使用babel-plugin-lodash

import _ from "lodash";
_.get({ a: { b: 5 } }, "a.b");
// → returns 5

使用babel-plugin-lodashlodash-webpack-plugin 之后

import _get from "lodash/get";
_get({ a: { b: 5 } }, "a.b");
// → returns undefined

代碼量從72kb 壓縮到 772b

啟用 scope hoisting

scope hoisting 對(duì)于 webpack 來說,就是將以前的模塊引用鏈拍扁為一個(gè)但又不會(huì)影響到已有的代碼。更好理解scope hoisting推薦閱讀:here

目前只有 webpack v3 以上版本才支持scope hoisting,開啟它是需要手動(dòng)配置,如下:

// webpack.config.js
const webpack = require("webpack");

module.exports = {
  plugins: [
    new webpack.optimize.ModuleConcatenationPlugin()
  ]
};
其他好用的插件

preload-webpack-plugin 讓靜態(tài)資源支持 DNS 預(yù)解析和預(yù)加載,配置如下:

// webpack.config.js
const PreloadWebpackPlugin = require("preload-webpack-plugin");
module.exports = {
  // ...
  plugins: [
    new PreloadWebpackPlugin({
      rel: "preload",
      as: "script",
      include: "all",
      fileBlacklist: [/.(css|map)$/, /base?.+/]
    })
  ]
}

script-ext-html-webpack-plugin 讓 js 加載方式支持 Async 或 defer,配置如下:

// webpack.config.js
const ScriptExtHtmlWebpackPlugin = require("script-ext-html-webpack-plugin");
module.exports = {
  // ...
  plugins: [
    new ScriptExtHtmlWebpackPlugin({
      defaultAttribute: "defer"
    })
  ]
}
總結(jié)

有點(diǎn)亂,不好總結(jié),大概就是整合 CSS 代碼加工流程到 webpack 中、壓縮第三方庫(kù)(Moment.js 和 Lodash )、啟用scope hoisting和其他好用的插件

大概就這樣,內(nèi)容較多~

文章首發(fā)于:https://www.linpx.com/p/webpa...
歡迎訪問我的博客:https://www.linpx.com

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/112459.html

相關(guān)文章

  • Webpack 最佳實(shí)踐總結(jié)()

    摘要:這里要介紹的是工作流中的一種很普遍的代碼加工流程正常的業(yè)務(wù)邏輯開發(fā)流程需要經(jīng)過預(yù)處理器如或,然后再經(jīng)過后處理器如進(jìn)行深加工。 還未看的,可以點(diǎn)擊查看上兩篇文章喲:Webpack 最佳實(shí)踐總結(jié)(一)、Webpack 最佳實(shí)踐總結(jié)(二) 好了,這篇是第三篇,也是完結(jié)篇,我感覺這一篇是最亂的一篇,湊合著看吧,不會(huì)讓你失望的 整合 CSS 加工流 有時(shí)候,前端項(xiàng)目中除了 JavaScript ...

    pkhope 評(píng)論0 收藏0
  • Webpack 最佳實(shí)踐總結(jié)(一)

    摘要:它會(huì)代替所有的實(shí)例的值為,從而使知道那些判斷表達(dá)式總是錯(cuò)誤的,從而刪除相關(guān)代碼,進(jìn)一步壓縮打包文件模塊機(jī)制項(xiàng)目中使用的,通過也能通過打包有用的代碼,進(jìn)一步減少大小。 好久沒寫文章,這次預(yù)計(jì)會(huì)帶來3篇的 Webpack 系列文章,將會(huì)在這幾天內(nèi)更新完。 Webpack3 自今年6月20日正式發(fā)布而來,給我們帶來Scope Hoisting和Magic Comments兩大功能,可惜不在這...

    jubincn 評(píng)論0 收藏0
  • 前端資源系列(4)-前端學(xué)習(xí)資源分享&前端面試資源匯總

    摘要:特意對(duì)前端學(xué)習(xí)資源做一個(gè)匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進(jìn)步。 特意對(duì)前端學(xué)習(xí)資源做一個(gè)匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進(jìn)步。 本以為自己收藏的站點(diǎn)多,可以很快搞定,沒想到一入?yún)R總深似海。還有很多不足&遺漏的地方,歡迎補(bǔ)充。有錯(cuò)誤的地方,還請(qǐng)斧正... 托管: welcome to git,歡迎交流,感謝star 有好友反應(yīng)和斧正,會(huì)及時(shí)更新,平時(shí)業(yè)務(wù)工作時(shí)也會(huì)不定期更...

    princekin 評(píng)論0 收藏0
  • 前方來報(bào),八月最新資訊--關(guān)于vue2&3的最佳文章推薦

    摘要:哪吒別人的看法都是狗屁,你是誰(shuí)只有你自己說了才算,這是爹教我的道理。哪吒去他個(gè)鳥命我命由我,不由天是魔是仙,我自己決定哪吒白白搭上一條人命,你傻不傻敖丙不傻誰(shuí)和你做朋友太乙真人人是否能夠改變命運(yùn),我不曉得。我只曉得,不認(rèn)命是哪吒的命。 showImg(https://segmentfault.com/img/bVbwiGL?w=900&h=378); 出處 查看github最新的Vue...

    izhuhaodev 評(píng)論0 收藏0
  • Webpack 最佳實(shí)踐總結(jié)(二)

    摘要:默認(rèn)做法是告訴瀏覽器這個(gè)文件的緩存時(shí)間,然后當(dāng)文件內(nèi)容被修改,則需要重命名該文件告訴瀏覽器需要重新下載和緩存,例如也能做類似的工作。 上一篇介紹了 Webpack 優(yōu)化項(xiàng)目的四種技巧,分別是通過 UglifyJS 插件實(shí)現(xiàn)對(duì) JavaScript 文件的壓縮,css-loader 提供的壓縮功能,配置NODE_ENV可以進(jìn)一步去掉無用代碼,tree-shaking幫助找到更多無用代碼 ...

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

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

0條評(píng)論

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