成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

[譯] Webpack——令人困惑的地方

anRui / 377人閱讀

摘要:處理文件的擴(kuò)展名很多的配置文件都有一個(gè)屬性,然后就像下面代碼所示有一個(gè)空字符串的值。空字符串在此是為了一些在文件時(shí)不帶文件擴(kuò)展名的表達(dá)式,如或者譯者注實(shí)際就是自動(dòng)添加后綴,默認(rèn)是當(dāng)成文件來(lái)查找路徑就這么多。

原文 Webpack—The Confusing Parts
issue討論

Webpack是目前基于React和Redux開(kāi)發(fā)的應(yīng)用的主要打包工具。我想使用Angular 2或其他框架開(kāi)發(fā)的應(yīng)用也有很多在使用Webpack。

當(dāng)我第一次看到Webpack的配置文件時(shí),它看起來(lái)非常的陌生,我非常的疑惑。經(jīng)過(guò)一段時(shí)間的嘗試之后我認(rèn)為這是因?yàn)閃ebpack只是使用了比較特別的語(yǔ)法和引入了新的原理,因此會(huì)讓使用者感到疑惑。這些也是導(dǎo)致Webpack不被人熟悉的原因。

因?yàn)閯傞_(kāi)始使用Webpack很讓人疑惑,我覺(jué)得有必要寫(xiě)幾篇介紹Webpack的功能和特性的文章以幫助初學(xué)者快速理解。此文是最開(kāi)始的一篇。

Webpack的核心原理

Webpack的兩個(gè)最核心的原理分別是:

1. 一切皆模塊

正如js文件可以是一個(gè)“模塊(module)”一樣,其他的(如css、image或html)文件也可視作模 塊。因此,你可以require("myJSfile.js")亦可以require("myCSSfile.css")。這意味著我們可以將事物(業(yè)務(wù))分割成更小的易于管理的片段,從而達(dá)到重復(fù)利用等的目的。

2. 按需加載

傳統(tǒng)的模塊打包工具(module bundlers)最終將所有的模塊編譯生成一個(gè)龐大的bundle.js文件。但是在真實(shí)的app里邊,“bundle.js”文件可能有10M到15M之大可能會(huì)導(dǎo)致應(yīng)用一直處于加載中狀態(tài)。因此Webpack使用許多特性來(lái)分割代碼然后生成多個(gè)“bundle”文件,而且異步加載部分代碼以實(shí)現(xiàn)按需加載。

好了,下面來(lái)看看那些令人困惑的部分吧。

1. 開(kāi)發(fā)模式和生產(chǎn)模式

首先要知道的是Webpack有許許多多的特性,一些是”開(kāi)發(fā)模式“下才有的,一些是”生產(chǎn)模式“下才有的,還有一些是兩種模式下都有的。

通常使用到Webpack如此多特性的項(xiàng)目都會(huì)有兩個(gè)比較大的Webpack配置文件

為了生成bundles文件你可能在package.json文件加入如下的scripts項(xiàng):

"scripts": {
  // 運(yùn)行npm run build 來(lái)編譯生成生產(chǎn)模式下的bundles
  "build": "webpack --config webpack.config.prod.js",
  // 運(yùn)行npm run dev來(lái)生成開(kāi)發(fā)模式下的bundles以及啟動(dòng)本地server
  "dev": "webpack-dev-server"
 }
2. webpack CLI 和webpack-dev-server

值得注意的是,Webpack作為模塊打包工具,提供兩種用戶交互接口:

Webpack CLI tool:默認(rèn)的交互方式(已隨Webpack本身安裝到本地)

webpack-dev-server:一個(gè)Node.js服務(wù)器(需要開(kāi)發(fā)者從npm自行安裝)

Webpack CLI(有利于生產(chǎn)模式下打包)

這種方式可以從命令行獲取參數(shù)也可以從配置文件(默認(rèn)叫webpack.config.js)獲取,將獲取到的參數(shù)傳入Webpack來(lái)打包。

當(dāng)然你也可以從命令行(CLI)開(kāi)始學(xué)習(xí)Webpack,以后你可能主要在生產(chǎn)模式下使用到它。

用法:

方式1: 
// 全局模式安裝webpack
npm install webpack --g
// 在終端輸入
$ webpack // <--使用webpack.config.js生成bundle

方式 2 :
// 費(fèi)全局模式安裝webpack然后添加到package.json依賴?yán)镞?npm install webpack --save
// 添加build命令到package.json的scripts配置項(xiàng)
"scripts": {
 "build": "webpack --config webpack.config.prod.js -p",
 ...
 }
// 用法:
"npm run build"
webpack-dev-server(有利于在開(kāi)發(fā)模式下編譯)

這是一個(gè)基于Express.js框架開(kāi)發(fā)的web server,默認(rèn)監(jiān)聽(tīng)8080端口。server內(nèi)部調(diào)用Webpack,這樣做的好處是提供了額外的功能如熱更新“Live Reload”以及熱替換“Hot Module Replacement”(即HMR)。

用法:

方式 1:
// 全局安裝
npm install webpack-dev-server --save
// 終端輸入
$ webpack-dev-server --inline --hot

用法 2:
// 添加到package.json scripts
"scripts": {
 "start": "webpack-dev-server --inline --hot",
 ...
 }
// 運(yùn)行: 
$ npm start

// 瀏覽器預(yù)覽:
http://localhost:8080
Webpack VS Webpack-dev-server選項(xiàng)

注意像inlinehot這些選項(xiàng)是Webpack-dev-server特有的,而另外的如hide-modules則是CLI模式特有的選項(xiàng)。

webpack-dev-server CLI選項(xiàng)和配置項(xiàng)

另外值得注意的是你可以通過(guò)以下兩種方式向webpack-dev-server傳入?yún)?shù):

通過(guò)webpack.config.js文件的"devServer"對(duì)象

通過(guò)CLI選項(xiàng)

// 通過(guò)CLI傳參
webpack-dev-server --hot --inline
// 通過(guò)webpack.config.js傳參
devServer: {
  inline: true,
  hot:true
}

我發(fā)現(xiàn)有時(shí)devServer配置項(xiàng)(hot: true 和inline: true)不生效,我更偏向使用如下的方式向CLI傳遞參數(shù):

// package.json
{
    "scripts": "webpack-dev-server --hot --inline"
}

注意:確定你沒(méi)有同時(shí)傳入hot:true-hot

webpack-dev-server的“hot” 和 “inline”選項(xiàng)

“inline”選項(xiàng)會(huì)為入口頁(yè)面添加“熱加載”功能,“hot”選項(xiàng)則開(kāi)啟“熱替換(Hot Module Reloading)”,即嘗試重新加載組件改變的部分(而不是重新加載整個(gè)頁(yè)面)。如果兩個(gè)參數(shù)都傳入,當(dāng)資源改變時(shí),webpack-dev-server將會(huì)先嘗試HRM(即熱替換),如果失敗則重新加載整個(gè)入口頁(yè)面。

// 當(dāng)資源發(fā)生改變,以下三種方式都會(huì)生成新的bundle,但是又有區(qū)別:
 
// 1. 不會(huì)刷新瀏覽器
$ webpack-dev-server
//2. 刷新瀏覽器
$ webpack-dev-server --inline
//3. 重新加載改變的部分,HRM失敗則刷新頁(yè)面
$ webpack-dev-server  --inline --hot
3. “entry”:值分別是字符串、數(shù)組和對(duì)象的情況

Enter配置項(xiàng)告訴Webpack應(yīng)用的根模塊或起始點(diǎn)在哪里,它的值可以是字符串、數(shù)組或?qū)ο?。這看起來(lái)可能令人困惑,因?yàn)椴煌愋偷闹涤兄煌哪康摹?/p>

像絕大多數(shù)app一樣,倘若你的應(yīng)用只有一個(gè)單一的入口,enter項(xiàng)的值你可以使用任意類型,最終輸出的結(jié)果都是一樣的。

enter:數(shù)組類型

但是,如果你想添加多個(gè)彼此不互相依賴的文件,你可以使用數(shù)組格式的值。

例如,你可能在html文件里引用了“googleAnalytics.js”文件,可以告訴Webpack將其加到bundle.js的最后。

enter:對(duì)象

現(xiàn)在,假設(shè)你的應(yīng)用是多頁(yè)面的(multi-page application)而不是SPA,有多個(gè)html文件(index.html和profile.html)。然后你通過(guò)一個(gè)對(duì)象告訴Webpack為每一個(gè)html生成一個(gè)bundle文件。

以下的配置將會(huì)生成兩個(gè)js文件:indexEntry.js和profileEntry.js分別會(huì)在index.html和profile.html中被引用。

用法:

//profile.html

//index.html

注意:文件名取自“entry”對(duì)象的鍵名。

enter:混合類型

你也可以在enter對(duì)象里使用數(shù)組類型,例如下面的配置將會(huì)生成3個(gè)文件:vender.js(包含三個(gè)文件),index.js和profile.js文件。

4. output:“path”項(xiàng)和“publicPath”項(xiàng)

output項(xiàng)告訴webpack怎樣存儲(chǔ)輸出結(jié)果以及存儲(chǔ)到哪里。output的兩個(gè)配置項(xiàng)“path”和“publicPath”可能會(huì)造成困惑。

“path”僅僅告訴Webpack結(jié)果存儲(chǔ)在哪里,然而“publicPath”項(xiàng)則被許多Webpack的插件用于在生產(chǎn)模式下更新內(nèi)嵌到css、html文件里的url值。

例如,在localhost(譯者注:即本地開(kāi)發(fā)模式)里的css文件中邊你可能用“./test.png”這樣的url來(lái)加載圖片,但是在生產(chǎn)模式下“test.png”文件可能會(huì)定位到CDN上并且你的Node.js服務(wù)器可能是運(yùn)行在HeroKu上邊的。這就意味著在生產(chǎn)環(huán)境你必須手動(dòng)更新所有文件里的url為CDN的路徑。

然而你也可以使用Webpack的“publicPath”選項(xiàng)和一些插件來(lái)在生產(chǎn)模式下編譯輸出文件時(shí)自動(dòng)更新這些url。

// 開(kāi)發(fā)環(huán)境:Server和圖片都是在localhost(域名)下
.image { 
  background-image: url("./test.png");
 }
// 生產(chǎn)環(huán)境:Server部署下HeroKu但是圖片在CDN上
.image { 
  background-image: url("https://someCDN/test.png");
 }
5. 模塊加載和鏈?zhǔn)侥K加載

模塊加載器是可自由添加的Node模塊,用于將不同類型的文件“l(fā)oad”或“import”并轉(zhuǎn)換成瀏覽器可以識(shí)別的類型,如js、Stylesheet等。更高級(jí)的模塊加載器甚至可以支持使用ES6里邊的“require”或“import”引入模塊。

例如,你可以使用babel-loader來(lái)將使用ES6語(yǔ)法寫(xiě)成的文件轉(zhuǎn)換成ES5:

module: {
 loaders: [{
  test: /.js$/, // 匹配.js文件,如果通過(guò)則使用下面的loader
  exclude: /node_modules/, // 排除node_modules文件夾
  loader: "babel" // 使用babel(babel-loader的簡(jiǎn)寫(xiě))作為loader
 }]
鏈?zhǔn)剑ü艿朗剑┑募虞d器(從右往左執(zhí)行)

多個(gè)loader可以用在同一個(gè)文件上并且被鏈?zhǔn)秸{(diào)用。鏈?zhǔn)秸{(diào)用時(shí)從右到左執(zhí)行且loader之間用“!”來(lái)分割。

例如,假設(shè)我們有一個(gè)名為“myCssFile.css”的css文件,然后我們想將它的內(nèi)容使用style標(biāo)簽內(nèi)聯(lián)到最終輸出的html里邊。我們可以使用css-loader和style-loader兩個(gè)loader來(lái)達(dá)到目的。

module: {
 loaders: [{
  test: /.css$/,
  loader: "style!css" //(short for style-loader!css-loader)
 }]

這里展示它是如何工作的:

Webpack在模塊顳部搜索在css的依賴項(xiàng),即Webpack檢查js文件是否有“require("myCssFile.css")”的引用,如果它發(fā)現(xiàn)有css的依賴,Webpack將css文件交給“css-loader”去處理

css-loader加載所有的css文件以及css自身的依賴(如,@import 其他css)到JSON對(duì)象里,Webpack然后將處理結(jié)果傳給“style-loader”

style-loader接受JSON值然后添加一個(gè)style標(biāo)簽并將其內(nèi)嵌到html文件里

6. loader自身可以配置

模塊加載器(loader)自身可以根據(jù)傳入不同的參數(shù)進(jìn)行配置。

在下面的例子中,我們可以配置url-loader來(lái)將小于1024字節(jié)的圖片使用DataUrl替換而大于1024字節(jié)的圖片使用url,我們可以用如下兩種方式通過(guò)傳入“l(fā)imit“參數(shù)來(lái)實(shí)現(xiàn)這一目的:

7. .babelrc 文件

babal-loader使用”presets“配置項(xiàng)來(lái)標(biāo)識(shí)如何將ES6語(yǔ)法轉(zhuǎn)成ES5以及如何轉(zhuǎn)換React的JSX成js文件。我們可以用如下的方式使用”query“參數(shù)傳入配置:

module: {
  loaders: [
    {
      test: /.jsx?$/,
      exclude: /(node_modules|bower_components)/,
      loader: "babel",
      query: {
        presets: ["react", "es2015"]
      }
    }
  ]
}

然而在很多項(xiàng)目里babal的配置可能比較大,因此你可以把babal-loader的配置項(xiàng)多帶帶保存在一個(gè)名為”.babelrc“的文件中,在執(zhí)行時(shí)babal-loader將會(huì)自動(dòng)加載.babelrc文件。

所以在很多例子里,你可能會(huì)看到:

//webpack.config.js 
module: {
  loaders: [
    {
      test: /.jsx?$/,
      exclude: /(node_modules|bower_components)/,
      loader: "babel"
    }
  ]
}

//.bablerc
{
 presets: ["react", "es2015"]
}
8. 插件

插件一般都是用于輸出bundle的node模塊。

例如,uglifyJSPlugin獲取bundle.js然后壓縮和混淆內(nèi)容以減小文件體積。

類似的extract-text-webpack-plugin內(nèi)部使用css-loader和style-loader來(lái)收集所有的css到一個(gè)地方最終將結(jié)果提取結(jié)果到一個(gè)獨(dú)立的”styles.css“文件,并且在html里邊引用style.css文件。

//webpack.config.js
// 獲取所有的.css文件,合并它們的內(nèi)容然后提取css內(nèi)容到一個(gè)獨(dú)立的”styles.css“里
var ETP = require("extract-text-webpack-plugin");

module: {
 loaders: [
  {test: /.css$/, loader:ETP.extract("style-loader","css-loader") }
  ]
},
plugins: [
    new ExtractTextPlugin("styles.css") //Extract to styles.css file
  ]
}

注意:如果你只是想把css使用style標(biāo)簽內(nèi)聯(lián)到html里,你不必使用extract-text-webpack-plugin,僅僅使用css loader和style loader即可:

module: {
 loaders: [{
  test: /.css$/,
  loader: "style!css" // (short for style-loader!css-loader)
 }]
9. 加載器(loader)和插件

你可能已經(jīng)意識(shí)到了,Loader處理多帶帶的文件級(jí)別并且通常作用于包生成之前或生成的過(guò)程中。

而插件則是處理包(bundle)或者chunk級(jí)別,且通常是bundle生成的最后階段。一些插件如commonschunkplugin甚至更直接修改bundle的生成方式。

10. 處理文件的擴(kuò)展名

很多Webpack的配置文件都有一個(gè)resolve屬性,然后就像下面代碼所示有一個(gè)空字符串的值??兆址诖耸菫榱藃esolve一些在import文件時(shí)不帶文件擴(kuò)展名的表達(dá)式,如require("./myJSFile")或者import myJSFile from "./myJSFile"(譯者注:實(shí)際就是自動(dòng)添加后綴,默認(rèn)是當(dāng)成js文件來(lái)查找路徑)

{
 resolve: {
   extensions: ["", ".js", ".jsx"]
 }
}

就這么多。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/79417.html

相關(guān)文章

  • webpack之謎

    摘要:通過(guò)中的通過(guò)選項(xiàng)使用方法通過(guò)通過(guò)我發(fā)現(xiàn)通過(guò)設(shè)置的配置項(xiàng)有時(shí)不起作用。當(dāng)代碼發(fā)生變化時(shí),以下種方式都會(huì)重新打包,但是不會(huì)重載頁(yè)面會(huì)重載整個(gè)頁(yè)面若失敗則加載整個(gè)頁(yè)面指出了打包入口文件,支持字符串?dāng)?shù)組和對(duì)象三種形式。 【注】本文原發(fā)自此處,轉(zhuǎn)載請(qǐng)注明出處。 本文譯自【W(wǎng)ebpack-The Confusing Parts】原文 本文已同步發(fā)表在我的博客 前言 webpack是當(dāng)前最受歡迎的模...

    _Zhao 評(píng)論0 收藏0
  • webpack 教程資源收集

    學(xué)習(xí)的過(guò)程中收藏了這些優(yōu)秀教程和的項(xiàng)目,希望對(duì)你有幫助。 github地址, 有不錯(cuò)的就更新 官方文檔 中文指南 初級(jí)教程 webpack-howto 作者:Pete Hunt Webpack 入門(mén)指迷 作者:題葉   webpack-demos 作者:ruanyf 一小時(shí)包教會(huì) —— webpack 入門(mén)指南 作者:VaJoy Larn   webpack 入門(mén)及實(shí)踐 作者:...

    Backache 評(píng)論0 收藏0
  • 】2016 年 JavaScript 回顧

    摘要:是在谷歌的年開(kāi)發(fā)者峰會(huì)上宣布,但穩(wěn)定的技術(shù)和工具終于在月到達(dá)。固然也不能保證蘋(píng)果將實(shí)施這項(xiàng)技術(shù),但這并不重要,你的應(yīng)用程序仍然可以在中工作,它只是不會(huì)從離線執(zhí)行中受益。我有一種感覺(jué)一旦上體驗(yàn)有明顯提升蘋(píng)果將鼓勵(lì)支持。 2016年是值得紀(jì)念、奇怪的、有點(diǎn)歡騰/可怕的一年,取決于你的觀點(diǎn)。跟其他事件相比僅僅專注于JavaScript可能看起來(lái)無(wú)關(guān)緊要,但它是每個(gè)Web開(kāi)發(fā)人員的工作生活中巨...

    gecko23 評(píng)論0 收藏0
  • 】2016 年 JavaScript 回顧

    摘要:是在谷歌的年開(kāi)發(fā)者峰會(huì)上宣布,但穩(wěn)定的技術(shù)和工具終于在月到達(dá)。固然也不能保證蘋(píng)果將實(shí)施這項(xiàng)技術(shù),但這并不重要,你的應(yīng)用程序仍然可以在中工作,它只是不會(huì)從離線執(zhí)行中受益。我有一種感覺(jué)一旦上體驗(yàn)有明顯提升蘋(píng)果將鼓勵(lì)支持。 2016年是值得紀(jì)念、奇怪的、有點(diǎn)歡騰/可怕的一年,取決于你的觀點(diǎn)。跟其他事件相比僅僅專注于JavaScript可能看起來(lái)無(wú)關(guān)緊要,但它是每個(gè)Web開(kāi)發(fā)人員的工作生活中巨...

    makeFoxPlay 評(píng)論0 收藏0
  • 】2016 年 JavaScript 回顧

    摘要:是在谷歌的年開(kāi)發(fā)者峰會(huì)上宣布,但穩(wěn)定的技術(shù)和工具終于在月到達(dá)。固然也不能保證蘋(píng)果將實(shí)施這項(xiàng)技術(shù),但這并不重要,你的應(yīng)用程序仍然可以在中工作,它只是不會(huì)從離線執(zhí)行中受益。我有一種感覺(jué)一旦上體驗(yàn)有明顯提升蘋(píng)果將鼓勵(lì)支持。 2016年是值得紀(jì)念、奇怪的、有點(diǎn)歡騰/可怕的一年,取決于你的觀點(diǎn)。跟其他事件相比僅僅專注于JavaScript可能看起來(lái)無(wú)關(guān)緊要,但它是每個(gè)Web開(kāi)發(fā)人員的工作生活中巨...

    church 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<