webpack學習總結


前言

在還未接觸webpack,就有幾個疑問:

1. webpack本質上是什么?

2. 跟異步模塊加載有關系嗎?

3. 可否生成多個文件,一定是一個?

4. 被引用的文件有其他異步加載模塊怎么辦?

在學習webpack時,也有幾個疑問:

1. webpack有哪些常用的插件?

2. 常用的Loader有哪些?

3. 由於運行時是使用編譯后,那開發調試怎么辦?

在學習webpack后,也剩幾個疑問:

1. 為什么用選擇webpack?

2. webpack的局限地方,或者不適用場景?

webpack是什么

webpack是一個前端構建的打包工具(並不是什么庫或框架), 它能把各種資源,例如JS(含JSX)、coffee、css(含less/sass)、圖片等都作為模塊來處理和使用。

根據模塊的依賴關系進行靜態分析,然后將這些模塊按照指定的規則生成對應的靜態資源。

代碼拆分(關鍵)

webpack有兩種組織模塊依賴的方式,同步和異步。異步依賴作為分割點,形成一個新的塊。在優化了依賴樹后,每一個異步區塊都作為一個文件被打包。

其實就是異步部分用require.ensure方法包裹起來,里面所有的依賴會生成單獨一個文件,每一個require.ensure生成一個文件。

示例:

index.html

<html>
<head>
  <meta charset="utf-8">
</head>
<body>
     <h1 id="t1"></h1>
     <h2 id="t2"></h2>
     <script src="dist/bundle.js"></script>
</body>
</html>

entry.js

document.getElementById("t1").innerHTML = 'I comming.';
require.ensure([], function () {//這里是異步的
     console.log("進入require.ensure回調")
     require("./module.js");
     require("./module2.js");
     console.log("調用完require.ensure")
});
require.ensure([], function () {//這里是異步的
     require("./module3.js");
});

module.js

document.getElementById("t2").innerHTML = 'I am async module.';
console.log('我是module.js啊啊啊啊');

module2.js

console.log('我是module2.js啊啊啊');

module3.js

console.log('我是module3.js啊啊啊');

webpack.config.js

var webpack = require('webpack');
var path = require("path");
 
module.exports = {
  entry: './entry.js',
  output: {
    path: path.join(__dirname, "dist"),
    filename: 'bundle.js',
     publicPath:"dist/", //給require.ensure用
    chunkFilename: "[name].chunk.js"//給require.ensure用
  },
  module: {
    loaders: [
      {test: /\.css$/, loader: 'style!css'}
    ]
  },
  plugins: [
    new webpack.BannerPlugin('This file is created by lufeng')
  ]
}

效果如下:

Q&A

1. webpack本質上是什么?

答:本質上就是打包工具,不是框架也不是庫。

2. 跟異步模塊加載有關系嗎?

答:webpack可以將需要異步加載的模塊(一個或多個)生成另外一個單獨文件,在require時才加載,算是有點關系吧。

3. 可否生成多個文件,一定是一個?

答:可以生成多個,一種是在webpack.config.js的entry聲明,另一種是異步依賴部分。

var webpack = require('webpack');
var path = require("path");
 
module.exports = {
  entry: {
     "entry" : './entry.js',
     "common" : './common.js'
  },
  output: {
     path: path.join(__dirname, "dist"),
     publicPath:"dist/", //給require.ensure用
    filename: "[name].js"
  },
  module: {
    loaders: [
      {test: /\.css$/, loader: 'style!css'}
    ]
  },
  plugins: [
    new webpack.BannerPlugin('This file is created by lufeng')
  ]
}

4. 被引用的文件有其他異步加載模塊怎么辦?

答:這個如第二個問題,異步部分生成一個單獨文件。

webpack loaders、plugins

Loader

webpack 本身只能處理原生的 JavaScript 模塊,但是 loader 轉換器可以將各種類型的資源轉換成 JavaScript 模塊。這樣,任何資源都可以成為 webpack 可以處理的模塊。

Plugin

webpack 還有一個功能豐富的插件系統。大多數內容功能都是基於這個插件系統運行的,還可以開發和使用開源的 webpack 插件,來滿足各式各樣的需求。

webpack loaders列表:http://webpack.github.io/docs/list-of-loaders.html

webpack plugins列表:http://webpack.github.io/docs/list-of-plugins.html

一些常用插件介紹文章:

1. 【WebPack實例與前端性能優化】:http://www.cnblogs.com/giveiris/p/5237080.html

2. 【webpack 使用優化指南】: http://www.cnblogs.com/yumeiqiang/p/5281170.html

Q&A

3. 由於運行時是使用編譯后,那開發調試怎么辦?

由於頁面引用的是編譯生成后的文件,那在開發的情況下,如何進行調試是我立馬想到的問題,難道在編譯后的文件調試,然后找到原文件改回來,這樣太麻煩了。

答:有可以顯示是原文件的辦法,步驟是:

(1). 在webpack.config.js配置devtool屬性

{
    devtool: "source-map"
}

(2). 使用 webpack-dev-server 開發服務。

# 安裝

$ npm install webpack-dev-server -g

# 運行

$ webpack-dev-server --progress --colors

PS:它將在 localhost:8080 啟動一個 express 靜態資源 web 服務器,並且會以監聽模式自動運行 webpack,在瀏覽器打開 http://localhost:8080/ 或http://localhost:8080/webpack-dev-server/ 可以瀏覽項目中的頁面和編譯后的資源輸出,並且通過一個 socket.io 服務實時監聽它們的變化並自動刷新頁面。

——這樣就能愉快的開發調試了。

webpack后談

1. 為什么用選擇webpack?

在我看來,選擇webpack應該是有幾點明顯優點:

(1). 可以將各種靜態資源視作模塊加載,不像RequireJS只能加載js。

(2). 可以很好的拆分成按需加載的塊,加載模塊方式非常舒適,不需回調。

(3). 擴展性強,插件機制完善。

2. webpack的局限地方,或者不適用場景?

不適用場景這個很難講,就不深究,而局限地方,等到徹徹底底踩坑后再做總結。

 

 

本文為原創文章,轉載請保留原出處,方便溯源,如有錯誤地方,謝謝指正。

本文地址 :http://www.cnblogs.com/lovesong/p/5790752.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM