웹 팩 이 tree-shaking 을 어떻게 우아 하 게 사용 하 는 지 알 아 보기(나무 흔 들 기 최적화)

1.트 리 쉐 이 킹 이란 무엇 인가
웹 팩 2 가 가 져 온 최고의 새로운 특성 중 하 나 는 트 리 쉐 이 킹 이다.tree-shaking 은 rollup.js 에서 기원 되 었 으 며,현재 웹 팩 2 도 비슷 한 방법 이 있다.
웹 팩 의 tree-shaking 이 온 것 은 es6 규범 모듈 덕분 입 니 다.왜 이렇게 말 합 니까?현재 의 전단 모듈 은 규범 이 매우 많 고 유행 하 는 예 를 들 어 comonJS,AMD,es6 등 이 있 습 니 다.저 는 간단하게 comonJS 와 es6 모듈 의 차 이 를 말씀 드 리 겠 습 니 다.
commonJS 모듈
commonJS 의 모듈 규범 은 Node 에서 빛 을 발 하고 전체적으로 보면 그 특성 은 다음 과 같다.
1.동적 로드 모듈
comonJS 와 es6 의 가장 큰 차 이 는 아마 여기에 있 을 것 입 니 다.comonJS 모듈 의 동적 로 딩 은 게 으 른 로 딩 을 쉽게 실현 하고 사용자 체험 을 최적화 할 수 있 습 니 다.
2.전체 모듈 불 러 오기
commonJS 모듈 에서 내 보 낸 것 은 전체 모듈 입 니 다.
3.각 모듈 이 대상
commonJS 모듈 은 모두 하나의 대상 으로 간주 된다.
4.값 복사
commonJS 의 모듈 출력 은 함수 의 값 전달 과 비슷 하 며 모두 값 의 복사 입 니 다.
es6 모듈
1.정적 해석
즉,분석 단계 에서 출력 모듈 을 확정 하기 때문에 es6 모듈 의 import 는 일반적으로 도 입 된 파일 의 시작 에 쓰 인 다.
2.모듈 은 대상 이 아니다
es6 에서 각 모듈 은 하나의 대상 으로 보지 않 습 니 다.
3.불 러 오 는 것 은 전체 모듈 이 아 닙 니 다.
es6 모듈 에 서 는 한 모듈 에 export 내 보 내기 가 여러 개 있 는 것 을 자주 볼 수 있 습 니 다.
4.모듈 의 인용
es6 모듈 에서 내 보 낸 것 은 모듈 의 값 복사 가 아니 라 이 모듈 의 참조 입 니 다.
es6 모듈 과 comonJS 모듈 의 차 이 를 결합 한 후에 우 리 는 es6 의 특징 이 정적 해석 이라는 것 을 알 게 되 었 고 comonJS 모듈 의 특징 은 동적 해석 이 므 로 es6 모듈 의 정적 해석 을 빌려 tree-shaking 의 실현 이 가능 하 다.
웹 팩 에서 tree-shaking 은 필요 에 따라 불 러 오 는 것 을 말 합 니 다.즉,인용 되 지 않 은 모듈 은 포장 되 지 않 고 우리 의 가방 크기 를 줄 이 며 응용 프로그램의 불 러 오 는 시간 을 줄 여 사용자 에 게 더욱 좋 은 체험 을 보 여 주 는 것 을 말 합 니 다.
2.tree-shaking 사용 방법
이렇게 말 을 많이 했 는데 트 리 쉐 이 킹 을 어떻게 하 는 거 예요?
웹 팩 의 기본 es6 규범 으로 작 성 된 모듈 은 tree-shaking 을 사용 할 수 있 습 니 다.이게 무슨 뜻 이 죠?다음은 예 를 들 어 보 겠 습 니 다.
우선 제 demo 디 렉 터 리 를 아래 와 같이 드 립 니 다.
├─dist
    └─index.html
├─node_modules
    └─...
├─src
    ├─scripts
    ├─assets
├─webpack.config.js
└─package.json
dist 는 포 장 된 코드 를 저장 하 는 데 사 용 됩 니 다.
src 반대로 원본 파일 저장
src 의 scripts 디 렉 터 리 는 js 스 크 립 트 파일 을 저장 하고 assets 는 정적 자원 파일 을 저장 합 니 다.
다음 몇 가지 명령 이 있 으 면 트 리-shaking 여행 을 시작 하 겠 습 니 다.

npm install --save-dev webpack webpack-dev-server
webpack.config.js
const webpack = require('webpack')
const path = require('path')
module.exports = {
  entry:'./src/scripts/main.js',
  output:{
    path:path.resolve(__dirname,'dist/'),
    filename:'main.bundle.js'
  },
  plugins:[
    new webpack.HotModuleReplacementPlugin()
  ],
  devServer:{
    port:4200,
    contentBase:path.resolve(__dirname,'dist/'),
    historyApiFallback:true,
    hot:true
  }
}

다음은 main.js 로 sayHello 를 직접 도입 했다.import { sayHello } from './greeter.ts'; sayHello();상응하는 main.js 의 의존 greeter.js

export function sayHello(){
  alert('hello')
}

export function sayWorld(){
  alert('world')
}
dist 디 렉 터 리 아래 에 index.html 가 포장 후의 bundle 을 도입 하 는 데 사 용 됩 니 다.

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  <script type="text/javascript" src="./main.bundle.js"></script>
</body>
</html>
이상 은 전체 demo 코드 입 니 다.다음 일 은 웹 팩 으로 포장 해 보 겠 습 니 다.
포장 후 지루 한 코드 를 제거 하고 chunk 참조 부분 만 보기:
[
/* 0 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__person__ = __webpack_require__(1);
Object(__WEBPACK_IMPORTED_MODULE_0__person__["a" /* sayHello */])();
/***/ }),
/* 1 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return sayHello; });
/* unused harmony export sayWorld */
    function sayHello(){
        alert('hello');
    }
    function sayWorld(){
        alert('world');
    }
/***/ })
/******/ ]
우 리 는 이 줄 에 관심 을 가진다.

/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return sayHello; });
사실 return 은 sayHello 하나 밖 에 없어 요.
그래서 우 리 는 지금 전체 Js 코드 를 압축 하면 인용 되 지 않 은 sayWorld 를 제거 할 수 있다.
다음 명령 을 입력 하여 압축 합 니 다.webpack --optimize-minimize압축 된 코드 가 한 줄 밖 에 없 기 때문에 우 리 는 꼬리 부분 을 옮 깁 니 다.

function(e,n,r){"use strict";function t(){alert("hello")}r.d(n,"a",function(){return t})}]);
sayWorld 함수 가 성공 적 으로 제거 되 었 음 을 볼 수 있 습 니 다.
웹 팩-dev-server 를 시작 합 니 다.webpack-dev-server브 라 우 저 에 입력
http://localhost:4200
这里写图片描述
매번 명령 줄 에 인 자 를 입력 해 야 합 니 다.귀 찮 지 않 습 니까?더 좋 은 방법 이 있 습 니까?
(1)이 명령 을 package.json 의 scripts 필드 에 넣 고 npm start 를 통 해 자동 으로 실행 할 수 있 습 니 다.
(2)사실 Coptimize-mainimize 의 바 텀 구현 은 플러그 인 UglifyJSPlugin 이기 때문에 웹 팩.config.js 에서 직접 설정 할 수 있 습 니 다.
웹 팩.config.js 에 플러그 인 설정

const path = require('path');
const webpack = require('webpack');

module.exports = {
  entry:'./src/scripts/main.js',
  output:{
    filename:'main.bundle.js',
    path:path.join(__dirname,'dist')
  },
  plugins:[
    new webpack.optimize.UglifyJsPlugin(), // <-----------   js
    new webpack.HotModuleReplacementPlugin()
  ],
  devServer:{
    port:4200,
    historyApiFallback:true,
    hot:true,
    contentBase:path.join(__dirname,"dist/")
  }
}

그리고 저희 웹 팩 포장.
같은 효 과 를 보 는 것 이다.

function(e,n,r){"use strict";function t(){alert("hello")}r.d(n,"a",function(){return t})}]);
tree-shaking 트리거 패키지 후 모듈 의 인용 을 제외 하고 압축 도 구 를 결합 하여 진행 하 는 것 이 야 말로 완전한 tree-shaking 입 니 다.
그럼 type:script 이 라면 tree-shaking 을 어떻게 사용 해 야 하나 요?
3.type:script 에서 tree-shaking 을 사용 하 는 방법
웹 팩 에서 ts 를 사용 하려 면 먼저 tsc 를 설치 해 야 합 니 다.npm install --save-dev typescript그 다음 에 ts 파일 을 분석 하 는 loader 가 필요 합 니 다.npm install --save-dev ts-loader그리고 웹 팩.config.js 에서 설정 합 니 다.

const webpack = require('webpack')
const path = require('path')

module.exports = {
  entry:'./src/scripts/main.ts',
  output:{
    path:path.resolve(__dirname,'dist/'),
    filename:'main.bundle.js'
  },
  module:{
    rules:[
      {
        test:/\.ts$/,
        use:['ts-loader']
      }
    ]
  },
  plugins:[
    new webpack.optimize.UglifyJsPlugin(),
    new webpack.HotModuleReplacementPlugin()
  ],
  devServer:{
    port:4200,
    contentBase:path.resolve(__dirname,'dist/'),
    historyApiFallback:true,
    hot:true
  }
}

내 두 개의 파일 main.ts,greeter.ts 를 바 칩 니 다.
main.ts

import { sayHello } from './greeter.ts';

sayHello();
greeter.ts

export var sayHello = function(){
  alert('hello')
}

export var sayWorld = function(){
  alert('world')
}
그 후에 우리 가 해 야 할 일 은 tsconfig.json 의 설정 파일 을 만들어 tsc 가 해석 할 수 있 도록 하 는 것 입 니 다.이때 구덩이 가 왔 습 니 다.
다음은 제 tsconfig.json 파일 입 니 다.

{
  "compilerOptions":{
    "target":"es5",
    "sourceMap":true
  },
  "exclude":[
    "./node_modules"
  ]
}
틀린 건 없 는 것 같 아 요.
이어서 저희 웹 팩.
압축 된 코드 의 마지막 부분 을 보 세 요:

"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.sayHello=function(){alert("hello")},n.sayWorld=function(){alert("world")}}]);
sayWorld 가 존재 하 다 니!!!어떻게 된 거 야?왜 트리거 트 리-shaking 최적화 되 지 않 았 어?
이것 은 tsc 가 컴 파일 한 코드 가 es5 이기 때 문 입 니 다.그 렇 기 때문에 tsc 는 기본적으로 comonJS 의 규범 을 사용 하여 모듈 을 불 러 옵 니 다.그래서 tree-shaking 을 촉발 하지 않 았 습 니 다.그러면 우 리 는 어떻게 해 야 합 니까?
tsconfig.json 을 수정 하고 target 을 es6 로 바 꾸 면 됩 니 다!

{
  "compilerOptions":{
    "target":"es6",
    "sourceMap":true
  },
  "exclude":[
    "./node_modules"
  ]
}
재 포장
포장 한 bundle 을 보 세 요.

function(e,n,r){"use strict";r.d(n,"a",function(){return t});var t=function({alert("hello")}}]);
역시 트 리 쉐 이 킹 을 촉발 시 켰 습 니 다.
webpack-dev-server 열기webpack-dev-serverHello 를 성공 적 으로 인쇄 한 것 을 볼 수 있 습 니 다.
这里写图片描述
이상 은 제 가 webpack tree-shaking 에 대한 정리 입 니 다.여러분 의 학습 에 도움 이 되 었 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기