webpack學習總結

来源:http://www.cnblogs.com/lovesong/archive/2016/08/20/5790752.html
-Advertisement-
Play Games

前言 在還未接觸webpack,就有幾個疑問: 1. webpack本質上是什麼? 2. 跟非同步模塊載入有關係嗎? 3. 可否生成多個文件,一定是一個? 4. 被引用的文件有其他非同步載入模塊怎麼辦? 在學習webpack時,也有幾個疑問: 1. webpack有哪些常用的插件? 2. 常用的Load ...


前言

在還未接觸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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、兄弟選擇器:①相鄰兄弟選擇器:元素的後一個兄弟元素,選擇器1+選擇器2;②通用兄弟選擇器:元素後的所有兄弟元素,選擇器1~選擇器2; 2、屬性選擇器:attr表示屬性名稱,elem表示元素名;①[attr]:頁面中所有帶有attr屬性的元素;②elem[attr]:頁面中所有帶attr屬性的el ...
  • 模板描述:html5 canvas首屏自適應背景動畫迴圈效果代碼 由於動態圖太大,怕以後伺服器受不了,所以現在都改為靜態圖了,大家點擊演示地址一樣的,希望大家喜歡,你們的支持就是小海的動力!! ...
  • 1、字體屬性:①字體格式:font-family:取值:“microsoft yahei”/Arial……;②字體大小:font-size:取值:pt/px;③字體加粗:font-weight:取值:normal(預設值)/bold(粗體,hn,b,strong的預設值)/400-900;④字體樣式 ...
  • 一、html概述 htyper text markup language 即超文本標記語言 超文本: 就是指頁面內可以包含圖片、鏈接,甚至音樂、程式等非文字元素。 標記語言: 標記(標簽)構成的語言. 網頁==HTML文檔,由瀏覽器解析,用來展示的 靜態網頁:靜態的資源,如xxx.html 動態網頁 ...
  • 一、什麼是JavaScrip JavaScript是一種動態類型、弱類型、基於原型的客戶端腳本語言。它的解釋器被稱為JavaScript引擎,為瀏覽器的一部分,廣泛用於客戶端的腳本語言,在HTML網頁上使用,用來給HTML網頁增加動態功能。 動態: 在運行時確定數據類型,通常變數的類型取決於值的類型 ...
  • html、javascript會涉及到三個解析器,html解析器、xml解析器、javascript解析器。那麼好了,問題來了,以上代碼經常混編在一起,各自有各自的規則,終究會有衝突的,如下就是衝突。 根據W3C XHTML 1.0的規定:在XHTML中,因為<和&這兩個符號有特殊意義(小於號用於標 ...
  • 網站logo既要考慮seo又需要用圖片代替網站名字,所有H1標簽帶來的權重還是需要使用 有些人喜歡直接把<H1></H1>標簽直接hidden掉,個人喜歡使用css Text-indent還是放到屏幕外 .logo h1 { overflow: hidden; position: absolute; ...
  • 4.選擇與分組 (1).分組 字元組[]:表示匹配若幹個字元之一 字元組可以淺顯的理解為一些字元的組合,字元組與普通字元的區別在於:abc普通字元表示匹配a接下來b接下來c而字元組[abc]表示在同一位置匹配a或者b或者c;由於字元組本身的含義也決定了可以將這個字元組看成是一個普通的特殊字元。 普通 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...