webpack學習筆記1

webpack學習筆記1:基本概念

前言:
現在在日常的開發中,webpack已經是必不可少的東西了,現在的需求基本都是用webpack對資源進行打包整合,所以打算寫一點關于webpack的東西,這是第一篇,主要是介紹一些基本的概念。

webpack的概念

眾所周知,webpack是一個模塊打包器,他會把項目里的各種資源進行統一打包,webpack打包的時候會遞歸的構建一個依賴圖,每個用到的模塊都在這個流程圖上,最后輸出一個javascript文件。

webpack由四個核心部分構成,分別是:

  • entry(入口)

  • output(出口)

  • loader(加載器)

  • plugin(插件)

entry入口

前邊說過,webpack打包的時候會構建一個依賴圖,而entry就是這個圖的起點,webpack會知道,從哪個文件開始進行他的打包之旅。
webpack中有多種方法指定entry

簡單語法

用法:

const config = {entry:'./path/app.js'
};module.exports = config;

其實這是下邊方式的簡寫

const config = {entry:{main:'./path/app.js'}
};module.exports = config;

上邊表示app.js文件是這個項目的入口文件,entry的值除了是一個字符串,還可能是一個數組。
如果你的項目很小,沒有依賴其他的大型庫,那么這種簡單的寫法是個很好的選擇,從app.js開始,按照依賴圖一次打包各個文件。
缺點是,這種配置缺乏一定的靈活性。

對象語法

前邊說,簡單寫法缺乏靈活性,是因為,加入依賴了一個很大的庫,比如react,每次執行打包的時候都需要把react打包一遍。

const config = {entry:{app:'./path/app.js',vendor:'./vendor.js'}
}module.exports = config;

上面看起來項目有兩個入口,app和vendor,兩者獨立于彼此,分別開始構建各自依賴的資源。這種方式常見于只有一個入口(app而不是vendor)的單頁面(SPA)應用。
vendor是一些公共的庫,不會發生輕易改變,甚至是不會改變,把他們提取出來會優化打包的效率,可以理解起到了一個緩存的作用。

多頁面應用程序

const config = {entry:{page1:'./src/page1/page1.js',page2:'./src/page2/page2.js',page3:'./src/page3/page3.js'}
}module.exports = config;

當項目是一個多頁面應用的時候,需要的是多個webpack入口,所以就會有多個依賴圖。這個我們看到,page1頁面的入口是page1.js,其他兩個頁面的也是如此。
多頁面不能用一個單個的入口的原因是,每次載入一個新的html,需要重新下載新的文件,所以頁面需要哪個文件,就依賴哪個。
我們可以用CommonshunkPlugin來每個頁面的共享代碼創建bundle,提供復用的機制,提高效率。

output出口

有入口就有出口,在webpack中,output表示項目的出口,即打完包輸出的文件。
即便有多個entry入口文件,可是在webpack中,只有指定一個輸出配置

用法

const config = {entry:'./sec/app.js',output:{filename:'bundle.js',path:'./src'}
}

配置項是一個對象,對象里有兩個屬性。

  • filename:表示打包輸出之后的文件名

  • path:表示打包輸出的路徑

多個入口的情況下

如何項目是有多個入口的情況下,這個時候使用占位符來確保每個文件有唯一的名稱

const config = {entry:{app1:'./src/app1.js',app2:'./src/app2.js'},output:{filename:[name].js,path:__dirname+'/dist'}
}

在dist文件夾下,會有打完包之后的app1.js和app2.js兩個文件。

loader加載

loader提供方法進行構建,包括去源代碼進行轉換,把不同的語言轉成javascript,或者把圖片轉成dataUrl或者把sass文件中換成css。總之,loader是webpack的精髓,功能強大。

示例

比如,我們要用webpack加載css文件或者把typescript轉成js,首先要安裝對應的loader。

npm install css-loader --save-dev
npm install ts-loader --save-dev

然后指示每個css使用css-loader,每個ts使用ts-loader.

const config = {entry:'./src/app.js',output:{filename:'bundle.js',path:__dirname+ '/dist'},module:{rules:[{test:/\.css$/,use:'css-loader'},{test:/\.ts$/,use:'ts-loader'}]}
}

使用loader的三種方式

在webpack中,有三種使用loader的方法,

  • 配置,在webpack的配置文件中配置(推薦)

  • 內聯,在import中指定相關loader

  • CLI, shell命令使用(這個先不研究了)

配置

module.rules允許你在webpack中配置多個loader,這是最好的方式,可以讓你一目了然的看到項目到底配置了哪些loader。

module:{rules:[{test:/\.css$/,use:[{loader:'style-loader'},{loader:'css-loader',options:{modules:true}}]},]
}

這是webpack2的語法。

內聯

可以在import或者任何等價于import的語句中使用loader,不過用的很少,其語法是這樣的

import style from 'style-loader!css-loader?modules'

盡量使用上一種配置的方法,因為可以減少代碼量,每次都import引用也是一件很麻煩的事情。

loader解析

多數情況下,loader將會從模塊路徑開始解析,就是npm install安裝的模塊。
loader需要導出為一個函數,通常采用node兼容的js寫法,有的時候也可以將自定義loader作為應用程序中的文件。通常情況下,采用xxx-loader的方式命名。

plugin插件

插件是webpack的支柱功能,一句話概括插件的作用就是做loader不能做的事情。

剖析

插件是一個擁有apply屬性的js對象。apply會被webpack compiler調用,comliler是個對象,可以再在整個編譯周期訪問。

function plugin1(){...
}
plugin.prototype.apply = function(compiler){compiler.plugin('run',function(compiler,callback){console.log('webpack構建開始了');callback();})
}

用法

由于插件是可能存在選項或者是參數的,所以在webpack文件中,需要在plugin屬性里用new把需要的插件傳進去,看下邊例子

配置

const config = {entry:{app:'./src/app.js',vendor:'./src/vendor.js'},output:{filename:[name].js,path:__dirname+'/dist'},nodule:{loaders:[{test:/\.css$/,use:'style-loader!css-loader'            }]},plugin:[new webpack.optimize.UglifyJsPlugin(),new HtmlWebpackPlugin({emplate:'./src/index.html'})]
};module.export = config;

后記

這篇文章主要介紹了一下webpack的基礎概念,包括webpack配置文件的四個主要部分,entry,output,loader,plugin的寫法。

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

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

相關文章

ruby 嵌套函數_Ruby嵌套有示例的循環

ruby 嵌套函數嵌套循環 (Nested for loop) Nesting of for loop means one for loop is available inside another for loop. It means that there are two loops, then the first one is an outer loop and the second one is the inner loop. Execution will take place in t…

oracle10數據庫鏈接失敗,Oracle10g出現Enterprise Manager 無法連接到數據庫實例解決辦法...

剛裝好 10g 時,把的監聽端口是1521.后來把端口改成了1568了,登上em發現Enterprise Manager 無法連接到數據庫實例 ,連接字符串的端口仍是1521,如何解決這個問題。登陸:出現下面錯誤:Enterprise …

springJdbc in 查詢,Spring namedParameterJdbcTemplate in查詢

springJdbc in 查詢,Spring namedParameterJdbcTemplate in查詢, SpringJdbc命名參數in查詢,namedParameterJdbcTemplate in查詢 >>>>>>>>>>>>>>>>>>>>>>>>>>…

oracle 11g r2版本號,Oracle 11g r2新增版本功能(二)

在11.2中,Oracle數據庫引入的版本的概念,這為應用程序的升級提供了極大的方便。這篇簡單描述版本的實現和查詢方式。前一篇簡單描述了版本,下面接著上面的例子看看Oracle是如何實現這個功能的:SQL> select synonym_name, table…

python 添加圖例_Python | 在圖例標簽中添加Sigma

python 添加圖例Sigma (𝜎) is very often used greek mathematical letters and has a higher repetition in probability. In this article, we are going to add 𝜎 using a command in matplotlib. Sigma(𝜎)是希臘數學字母中經常使用的字…

【51CTO學院】搜索V2.0——新的搜索,只為給你更好的

為了讓你能快速、準確的找到自己心儀的內容,51CTO學院產品及研發用盡了洪荒之力研發近2個月終于將搜索進行了全面升級。 搜索看似簡單,實則要做到精準和智能卻不是件易事,為了讓學員快速找到自己所需,節省找課時間,更高…

oracle擴容日志文件,ORACLE 加大日志文件

--新建臨時日志文件alter database add logfile group 4 (‘/u01/app/oracle/oradata/orcl/redo04.log‘) size 10m;alter database add logfile group 5 (‘/u01/app/oracle/oradata/orcl/redo05.log‘) size 10m;alter database add logfile group 6 (‘/u01/app/oracle/orad…

java多線程總結(二)

線程一般有6個狀態: 新建狀態:NEW 可運行狀態:RUNNABLE 休眠狀態:TIMED_WAITING 等待狀態:WAITING 阻塞狀態:BLOCKED 終止狀態“TERMINATED 當我們使用new創建線程之后,線程處于新建狀態,當調用…

scandir函數_PHP scandir()函數與示例

scandir函數PHP scandir()函數 (PHP scandir() function) The full form of scandir is "Scan Directory", the function scandir() is used to get the list of the files and directories available in the specified directory. scandir的完整格式為“ Scan Direc…

韓順平.2011最新版.玩轉oracle視頻教程筆記,韓順平.2011最新版.玩轉oracle視頻教程(筆記)...

韓順平.2011最新版.玩轉oracle視頻教程ORA-01045: user XIAOMING lacks CREATE SESSION privilege; logon denied 警告: 您不再連接到 ORACLE。 SQL> show user; USER 為 ""SQL> conn system/p; 已連接。SQL> grant connect to xiaoming; 授權成功。SQL>…

方冪序列 c+~+_C ++編程中的Trigraph序列

方冪序列 c~Trigraph Sequences in C are the set of three characters starting from double question marks (??). These set of the characters replaces by a single character specified in the below table, C 中的Trigraph序列是從雙問號( ?? )開始的三個…

oracle sysauth,sysauth$基表的用戶權限的一點分析

select privilege#,level from sysauth$ connect by grantee#prior privilege# and privilege#>0 start with grantee#:1 and privilege#>0如上的sql語句頻繁執行,其實對于遞歸sql對于自己初始oracle才一年的菜鳥一般是略去不看的,eygle前輩們有時…

ansys 內聚力_內聚力 軟件工程

ansys 內聚力凝聚 (Cohesion) In general terms, the word cohesion means the action or act of forming a united whole. According to the definition of Cambridge University, cohesion is defined as "the state of sticking together, or being in close agreement…

oracle認證都需要考哪幾個方面,Oracle OCP認證要通過哪些考試

Oracle OCP認證要通過哪些考試Oracle OCP DBA認證是所有Oracle認證中最普及的一種認證,這一認證過程是專為那些想要從事Oracle管理的專業數據庫管理人員設計的,適用于Oracle9I DBAs的OCP認證通過改進,刪除了備份和恢復以及網絡考試&#xff0…

左側固定 右側自適應三種方法

第一種&#xff1a;float 單一層浮動法 例如&#xff1a;左側固定成100px; 則核心代碼 左側&#xff1a;width:100px;float:left; 右側 width:auto;margin-left:100px; 實例&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8&q…

ruby 集合 分組_在Ruby中打印集合的元素

ruby 集合 分組We have gone through the implementation of sets in Ruby. They are very similar to arrays. Now, let us see how we print the elements present in a set. There are no indexes present in the sets because sets are used to store the large elements. …

linux下tmp目錄屬性,Linux:文件夾屬性及umask

回顧&#xff1a;文件在小&#xff0c;也要占用一個Block如&#xff1a;echo > a1.logls a1.log(文件大小為1k)du a1.log(文件大小也應該為1k&#xff0c;如果不是1k&#xff0c;可能selinux是打開的)du -s a1.log文件夾的權限&#xff0c;系統中的文件夾默認權限基本上都為…

python淺復制與深復制_Python中的淺復制與深復制

python淺復制與深復制In python, the assignment operator does not copy the objects, instead, they create bindings between an object and the target. The object, if a collection that is mutable or consists of mutable items uses the copy so that one can change …

邏輯回歸 數據_數據科學中的邏輯回歸

邏輯回歸 數據邏輯回歸 (Logistic Regression) Logistic regression is an applied mathematics analysis methodology accustomed to predict a data price supported previous observations of a data set. Logistic regression has become a very important tool within the…

Dede?刪除文檔同時文章中的圖片的方法

首先,在"/include"目錄下建立"extend.func.php"文件. 然后,將以下內容保存在"extend.func.php"文件中,一共三個函數&#xff1a;//解析body數據&#xff0c;獲得所有圖片的絕對地址function GetPicsTruePath($body,$litpic){$delfiles array();…