日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

webpack之tree shaking

 印度阿三17 2020-03-19

什么是tree-shaking?

前端中的tree-shaking可以理解為通過工具"搖"我們的js文件,將其中用不到的代碼"搖"掉,是一個性能優(yōu)化的范疇。具體來說,在webpack項目中,
有一個入口文件,相當(dāng)于一棵樹的主干,入口文件有很多依賴的模塊,相當(dāng)于樹枝。實際情況中,雖然依賴?yán)材硞€模塊,但其實只使用其中的某些功能。通過
tree-shaking,將沒有使用的模塊搖掉,這樣來達(dá)到刪除無用代碼的目的。

tree-shaking原理

tree-shaking原理,簡單來說

  • tree shaking的本質(zhì)是消除無用的Javascript代碼
  • 因為ES6模塊的出現(xiàn),ES6模塊依賴關(guān)系是確定的,和運行時的狀態(tài)無關(guān),可以進(jìn)行可靠的靜態(tài)分析

怎么使用tree-shaking?

  • 在webpackDemo/demo下新建一個文件tree-shaking,文件目錄如下

  • index.js內(nèi)容如下
import {add} from "./math.js"
console.log(mathFn)
function component(){
    var element = document.createElement("pre");
    element.innerHTML = [
        "hello webpack",
        "5 cubed is equal to "   add(5,6)
    ].join("\n\n");
    return element;
}
document.body.appendChild(component())
  • math.js內(nèi)容如下
export function add(a,b){
    console.log("add");
    return a b;
}

export function minus(a,b){
    console.log("minus")
    return a-b
}

export function multiply(a,b){
    console.log("mutiply");
    return a*b;
}

export function divide(a,b){
    console.log("divide");
    return a/b;
}

  • tree-shaking.js內(nèi)容如下
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const {CleanWebpackPlugin} = require("clean-webpack-plugin");
const webpack = require("webpack");
module.exports = {
    mode:"development",
    entry:path.resolve(__dirname,"src/index.js"),
    module:{
        rules:[
            {
                test:/\.m?js$/,
                exclude:/(node_modules|bower_components)/,
                use:{
                    loader:"babel-loader",
                    options:{
                        presets:["@babel/preset-env"],
                        plugins:[
                            "@babel/plugin-transform-runtime"
                        ]
                    }
                }
            }
        ]
    },
    output:{
        filename:"bundle.js",
        path:path.resolve(__dirname,"dist")
    },
    plugins:[
        new CleanWebpackPlugin(),
        new HtmlWebpackPlugin(),
//      new webpack.NamedModulesPlugin(),
//      new webpack.HotModuleReplacementPlugin()
    ],
    devtool:"inline-source-map",
//  devServer:{
//      contentBase:"./dist",
//      hot:true,
//      inline:true
//  }
}
  • package.json 內(nèi)容如下
{
  "name": "webpackDevServer",
  "sideEffects": false,
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev": "webpack-dev-server --config demo/webpack-dev-server/webpack-dev-server.js",
    "server": "node demo/webpack-dev-middleware/server.js",
    "hmr": "webpack-dev-server  --config demo/HMR/webpack.hmr.js",
    "treeShaking:dev": "webpack-dev-server --config demo/tree-shaking/tree-shaking.js",
    "treeShaking:build": "webpack  --config demo/tree-shaking/tree-shaking.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@babel/core": "7.6.4",
    "@babel/plugin-transform-runtime": "^7.6.2",
    "@babel/preset-env": "^7.6.3",
    "babel-loader": "8.0.6",
    "clean-webpack-plugin": "3.0.0",
    "css-loader": "3.2.0",
    "express": "4.17.1",
    "html-webpack-plugin": "3.2.0",
    "style-loader": "1.0.0",
    "webpack": "4.41.2",
    "webpack-cli": "3.3.9",
    "webpack-dev-middleware": "3.7.2",
    "webpack-dev-server": "3.8.2"
  }
}
  • 執(zhí)行 npm run treeShaking:build

執(zhí)行結(jié)果如下

執(zhí)行后我們可以看到bundle.js文件,可以發(fā)現(xiàn)math.js中所有的代碼都被打包了,而我們只用了文件中的add函數(shù),我們沒用到的函數(shù)不想打包到文件,這時我們可以用到tree-shaking

  • 啟用webpack
    當(dāng)前項目中使用的是webpack4,講mode設(shè)置為production即可開啟tree shaking

關(guān)于side effects(副作用)

副作用是指除了函數(shù)返回值以外,任何在函數(shù)調(diào)用之外觀察到的應(yīng)用程序狀態(tài)改變。副作用包括:

  • 改變了任何外部變量或?qū)ο髮傩?例如,全局變量,或者一個在父級函數(shù)作用域鏈上的變量)
  • 寫日志
  • 在屏幕輸出
  • 寫文件
  • 發(fā)網(wǎng)絡(luò)請求
  • 觸發(fā)任何外部進(jìn)程
  • 調(diào)用另一個有副作用的函數(shù)

tree shaking不能自動的識別那些代碼屬于side effects,因此手動指定這些代碼非常重要,如果不指定可能會出現(xiàn)一些意想不到的問題

在webpack中,是通過packge.json的sideEffects屬性來實現(xiàn)的
{
"name":"tree-shaking",
"sideEffects":false
}

如果所有代碼都包含副作用,我們可以簡單地將屬性標(biāo)記為false,并告知webpack,他可以安全地刪除未用到的export導(dǎo)出

如果你的代碼確實有一些副作用,那么可以改為提供一個數(shù)組

{
"name": "tree-shaking",
"sideEffects": [
"./src/common/polyfill.js"
]
}

總結(jié)

  • tree shaking 不支持動態(tài)導(dǎo)入(如CommonJS的require()語法),只支持純靜態(tài)的導(dǎo)入(ES6的import/export)
  • webpack中可以在項目package.json中添加一個"sideEffects"屬性,手動指定有副作用的腳本

將mode修改,在package.json里設(shè)置sideEffects:false結(jié)果如下

我們可以看出使用了tree shaking后,代碼體積變小,并且我們引用的math.js函數(shù)add被轉(zhuǎn)換,其他未引用的代碼并沒有出現(xiàn)

來源:https://www./content-4-663051.html

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多