webpack入門進階調優第一章

1.1何為Webpack

webpack是開源的JS模塊打包工具

核心功能是解決模塊之間的依賴,吧哥哥模塊按照特定的規則和順序組織在一起,最終合并為一個JS文件。這個過程叫模塊打包

1.2為何需要Webpack

1.2.1何為模塊

在設計程序結構時,更好的組織方式是按照特定的功能將其拆分為多個代碼段,每個代碼段實現一個特定的目的。可進行獨立的設計開發測試,最終通過接口來組合在一起,這就是基本的模塊化思想。

1.2.2 JavaScript中的模塊

JavaScript中沒有模塊,Brendan Rich最初設計語言只定位成小型腳本語言。再過去很長時間只能通過script標簽將他們一個個插入頁面,缺點很多:

  • 需要手動維護加載順序,依賴關系隱式
  • 每個script意味一次請求,拖慢網頁渲染速度
  • 每個script標簽頂層作用域即全局作用域,容易造成全局作用域的污染。

模塊化解決了上述問題:

  • 通過導入導出語句清晰看到模塊間的依賴關系
  • 模塊可以借助工具進行打包,在頁面中只需要加載合并后的資源文件,減少網絡開銷
  • 多個模塊之間作用域隔離,彼此不會用命名沖突

2015年, ES6正式定義了JavaScript模塊標準!已得大多數現代瀏覽器支持,但實際應用方面還需要等待一段時間,主要原因:

  • 無法使用 code splitting 和 tree shaking
  • 大多數npm模塊還是CommonJS形式,瀏覽器不支持其語法,沒法世界拿來用
  • 仍然需要考慮個別瀏覽器及平臺的兼容性問題

那么,如何讓我們的工程在使用模塊化的同時也能正常運行在瀏覽器中,就到了模塊打包工具的出場了。

1.2.3模塊打包工具

任務是解決模塊間的依賴,使其打包后的結果能運行在瀏覽器上。工作方式主要分兩種:

  • 將存在依賴關系的模塊按照特定規則合并為單個JS文件,一次全部加載進頁面
  • 在頁面初始時加載一個入口模塊,其他模塊一步的進行加載

目前社區中比較流行的模塊打包工具Webpack、Parcel、Rollup等

1.2.4 為何選擇Webpack

1) Webpack默認支持多種模塊標準,包括AMD、CommonJS,以及最終的ES6模塊

2)Webpack有完備的代碼分割(code splitting)解決方案

3)Webpack可以處理各種類型的資源

4)Webpack擁有龐大的社區支持。

1.3安裝

安裝Node.js環境

node -v
npm -v

npm安裝Webpack方式:一種全局安裝,一種本地安裝

全局安裝Webpack好處是npm幫我們綁定一個命令行環境變量,一次安裝處處運行

本地安裝則會添加其成為項目中的依賴,只能在項目內部使用。

建議本地安裝方式,主要原因:

  • 全局安裝與他人進行項目協作時,由于每個人系統中Webpack版本不同,可能會導致輸出結果不一致
  • 部分依賴于Webpack的插件會調用項目中的Webpack的內部模塊,這種情況下仍然需要在項目本地安裝Webpack,而如果全局本地都用則容易混淆

新建一個工程目錄

npm init

生成一個package.json文件

安裝Webpack命令

npm i webpack webpack-cli --save-dev

webpack是核心模塊,webpack-cli則是命令行工具,在本例中兩者是必需的

安裝結束后,在命令行執行npx webpack -v 以及 npx webpack-cli -v 可顯示各自的版本號,即證明安裝成功

1.4打包第一個應用

工程目錄添加以下幾個文件

index.js

import addContent from "./add-content.js";
document.write("my first Webpack app.<br />");
addContent();

add-content.js

export default function () {document.write("Hello world!");
}

index.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>My first Webpack app.</title></head><body><script src="./dist/bundle.js"></script></body>
</html>

在控制臺輸入打包命令

npx webpack --entry=./index.js --output-filename=bundle.js --mode=development

打包效果

用瀏覽器打開index.html,如圖

?

?回顧指令

entry是資源打包入口。webpack從這里開始進行模塊查找

output-filename是輸出資源名,打包完成出現dist目錄包含bundle.js是Webpack打包結果

mode是打包模式(development、production、none),當置于development和production模式下自動添加適合當前模式的一系列配置,減少人為工作量。開發環境一般設置為development模式

1.4.2使用npm script

為了使命令行指令簡潔,我們可以在package.json中添加一個腳本命令

"scripts": {"build": "webpack --entry=./index.js --output-filename=bundle.js --mode=development"},

重新打包輸入npm命令即可

npm run build

1.4.3使用默認目錄配置

通常我們分別設置源碼目錄與資源輸出目錄

工程中創src目錄,并將index.js和add-content.js移動到該目錄下,資源輸出目錄,Webpack已經默認是/dist,源代碼入口Webpack默認就是src/index.js。可以省略掉entry配置

編輯package.json:

"scripts": {"build": "webpack --output-filename=bundle.js --mode=development"},

1.4.4使用配置文件

?Webpack有非常多的配置項以及對應的命令行參數

npx webpack -h

當項目需要越來越多的配置項時,命令維護困難。所以創建一個配置文件,在Webpack每次打包是讀取該配置即可

工程下創建 webpack.config.js

module.exports = {entry: "./src/index.js",output: {filename: "bundle.js",},mode: "development",
};

值得注意的是Webpack對于output.path的要求是使用絕對路徑(從系統根目錄開始的完整路徑),之前我們在命令行中為了簡潔所以使用了相對路徑,而在webpack.config.js中,我們通過調用node.js的路徑拼裝函數——path.join,將__dirname與dist連接起來,得到了最終的資源輸出路徑。

去掉package.json中配置的打包參數了

"scripts": {"build": "webpack"},

1.4.5webpack-dev-server

提高調試效率的本地開發工具 文件修改,自動刷新

npm install webpack-dev-server --save-dev

ps:--save-dev將工具作為devDependencies開發環境依賴,工程上線時要進行依賴安裝可以通過

npm install --production過濾掉devDependencies中的模塊

為了便捷啟動webpack-dev-server,添加dev指令

"scripts": {"dev": "webpack-dev-server","build": "webpack"},

更改webpack.config.js

module.exports = {entry: "./src/index.js",output: {filename: "./bundle.js",},mode: "development",devServer: {publicPath: '/dist',}
};

添加devServer對象專門放webpack-dev-server配置。webpack-dev-server可以看做服務者,接收瀏覽器請求,將資源返回。當服務啟動時,會先讓Webpack進行模塊打包并將資源準備好。當接收到瀏覽器的資源請求時,會首先進行URL地址校驗。如果改地址是資源服務地址(上面配置的publicPath),就從打包結果中尋找該資源返回瀏覽器。反之,地址不屬于資源服務地址,則直接讀取硬盤中的源文件并將其返回。

webpack-dev-server兩大職能:

1.令Webpack進行模塊打包,并處理靜態資源文件請求

2.作為普通的Web Server,處理靜態資源文件請求

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/247271.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/247271.shtml
英文地址,請注明出處:http://en.pswp.cn/news/247271.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python類的空間問題及類之間的關系

類的空間問題及類之間的關系 類的空間問題 1.何處可以添加對象屬性 class A:def __init__(self,name):self.name namedef func(self,sex):self.sex sexobj A("alex") obj.age 18 # 通過__init__方法添加 print(obj.__dict__) obj1 A("wusir") obj.fun…

計算機視覺應關注的資源

來自美國帝騰大學的鏈接。 Camera Calibration Links to toolboxes (mostly MATLAB) for camera calibration. Paul Debevec. Modeling and Rendering Architecture from Photographs. Marc Pollefeys, Tutorial on 3D Modeling from Images,, ECCV 2000, Available here: not…

Angular 內容投影 II

內容投影是一種模式,你可以在其中插入或投影要在另一個組件中使用的內容。 簡單來說,angular的內容投影就相當于vue的內容插槽slot。所有一下就能懂了。 1、單插槽內容投影 單插槽內容投影是指創建一個組件,你可以在其中投影一個組件。如果只有一個ng-content,不需要sel…

麻省理工學生發明 震驚世界

核心提示&#xff1a;在普拉納夫看來&#xff0c;數字信息以像素的形式被限制在顯示屏幕之中。他發明的"第六感裝置"震驚全場&#xff0c;讓世界為之驚嘆。 MIT(麻省理工)印度裔學生Prarnav Mistry的天才發明:“第六感裝置” 視頻地址&#xff1a;http://v.youku.com…

Selenium常用API的使用java語言之13-多表單切換

在 Web 應用中經常會遇到 frame/iframe 表單嵌套頁面的應用&#xff0c; WebDriver 只能在一個頁面上對元素識別與 定位&#xff0c; 對于 frame/iframe 表單內嵌頁面上的元素無法直接定位。 這時就需要通過 switchTo().frame()方法將當前定 位的主體切換為 frame/iframe 表單的…

yarn下載依賴慢的解決方法

首先設置npm或者yarn鏡像為淘寶鏡像 詳情&#xff1a; 淘寶 NPM 鏡像 npm config set registry https://registry.npm.taobao.org OR yarn config set registry https://registry.npm.taobao.org 在項目的根目錄添加.npmrc 或者 .yarnrc 把鏡像源設置淘寶鏡像&#xff0c;nod…

立身成敗 在于所染

唐朝有一位正直的丞相很受唐太宗的賞識&#xff0c;他叫魏征。他說過一句話&#xff1a;“立身成本在于所染”。這句話的意思就是說&#xff0c;一個人一生成敗的關鍵在于交友。 孔子曰&#xff1a;“與善人居&#xff0c;如入芝蘭之室&#xff0c;久而不聞其香&#xff0c;即與…

Java生鮮電商平臺-優惠券系統的架構設計與源碼解析

Java生鮮電商平臺-優惠券系統的架構設計與源碼解析 電商后臺&#xff1a;實例解讀促銷系統 電商后臺系統包括商品管理系統、采購系統、倉儲系統、訂單系統、促銷系統、維權系統、財務系統、會員系統、權限系統等&#xff0c;各系統之間相互關聯、相互依托&#xff0c;為前端的正…

react-router-dom v6.1.1 使用方式

v5版本例子代碼 import {BrowserRouter as Router, Switch, Route} from react-router-dom import App from /App import Home from /views/Home/Home import Fast from /views/Fast/Fast import User from /views/User/Userconst BaseRouter () > {return (<Router>…

VC 2010下安裝OpenCV2.4.4

說明&#xff1a; 安裝平臺&#xff1a;32位XP&#xff0c;VS2010&#xff1b;OpenCV 2.4.4不支持VC 6.0&#xff1b;網上有很多用CMake編譯OpenCV的安裝教程&#xff0c;這里建議先不要自己編譯&#xff0c;如果使用預編譯好的庫有問題&#xff0c;再嘗試自己編譯。希望大家好…

vue3源碼中的最長遞增子序列

求解最長遞增子序列是一道經典的算法題, 多數解法是使用動態規劃的思想&#xff0c;算法的時間復雜度是O(); 而Vue.js內部使用的是維基百科提供的一套“貪心二分查找”的算法; 貪心算法的時間復雜度是O(n)&#xff0c;二分查找的時間復雜度是O(logn)&#xff0c;總時間復雜度…

認識“數字圖像”

不同領域的人對圖像的概念有著不同的理解。從工程學角度上講&#xff0c;“圖”是物體透射或反射光的分布&#xff1b;“像”是人的視覺系統對圖的接收在大腦中形成的印象或認識。因此&#xff0c;圖像常與光照、視覺等概念聯系在一起&#xff0c;光的強弱、光的波長以及物體的…

Java編程基礎階段筆記 day04 Java基礎語法(下)

? 面向對象編程 筆記Notes 面向對象三條學習主線 面向過程 VS 面向對象 類和對象 創建對象例子 面向對象的內存分析 類的屬性&#xff1a;成員變量 成員變量 VS 局部變量 類的方法 方法的重載 可變個數形參 面向對象&#xff1a;封裝性 訪問權限修飾符 構造方法&…

漢諾塔遞歸算法

起源&#xff1a; 漢諾塔&#xff08;又稱河內塔&#xff09;問題是源于印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子&#xff0c;在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子…

Java編程基礎階段筆記 day 07 面向對象編程(上)

? 面向對象編程 筆記Notes 面向對象三條學習主線 面向過程 VS 面向對象 類和對象 創建對象例子 面向對象的內存分析 類的屬性&#xff1a;成員變量 成員變量 VS 局部變量 類的方法 方法的重載 可變個數形參 面向對象&#xff1a;封裝性 訪問權限修飾符 構造方法&…

談“發表(撰寫)學術論文的注意事項”

題記&#xff1a;做兩個核心學術期刊的“數字圖像處理”類審稿專家有一段時間了&#xff0c;在審稿過程中發現存在很多問題&#xff0c;所以在此就撰寫學術論文過程中的一些注意事項&#xff0c;跟大家交流一下&#xff08;當然&#xff0c;文中的很多觀點也是一些資深主編的看…

Vue/Angular中父窗口新開的子窗口關閉的時候刷新父窗口

最近遇到一個項目需求&#xff1a;Angular中父窗口新開的子窗口提交完信息關閉的時候刷新父窗口。 知識點&#xff1a; window.opener 概述 返回打開當前窗口的那個窗口的引用&#xff0c;例如&#xff1a;在window A中打開了window B&#xff0c;B.opener 返回 A. 語法 …

圖像邊緣特征

圖像邊緣是圖像的重要特征&#xff0c;是圖像中特性&#xff08;如像素灰度、紋理等&#xff09;分布的不連續處&#xff0c;圖像周圍特性有階躍變化或屋脊狀變化的那些像素集合。圖像的邊緣部分集中了圖像的大部分信息&#xff0c;一幅圖像的邊緣結構與特點往往是決定圖像特質…

HDU 6631 line symmetric(枚舉)

首先能想到的是至少有一對相鄰點或者中間間隔一個點的點對滿足軸對稱&#xff0c;那么接下來只需要枚舉剩下的點對是否滿足至多移動一個點可以滿足要求。 第一種情況&#xff0c;對于所有點對都滿足要求&#xff0c;那么Yes。 第二種情況&#xff0c;有一個點不滿足要求&#x…

學習數字圖像處理經驗談

一、面向應用&#xff1a;層層分解、抓住要點 我們學習數字圖像處理的最終目的還是應用&#xff0c;不管是用它來研制產品還是研發項目抑或是研究課題&#xff0c;都要用數字圖像處理的理論、方法和技術來解決實際問題。在此過程中&#xff0c;提高效率是非常重要的&#xff0c…