乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      webpack之tree shaking

       印度阿三17 2020-03-19

      什么是tree-shaking?

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

      tree-shaking原理

      tree-shaking原理,簡單來說

      • tree shaking的本質(zhì)是消除無用的Javascript代碼
      • 因為ES6模塊的出現(xiàn),ES6模塊依賴關(guān)系是確定的,和運行時的狀態(tài)無關(guā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
        當前項目中使用的是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ā)任何外部進程
      • 調(diào)用另一個有副作用的函數(shù)

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

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

      如果所有代碼都包含副作用,我們可以簡單地將屬性標記為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)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多