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

資訊專欄INFORMATION COLUMN

Webpack的坑位整理

lidashuang / 2695人閱讀

摘要:在尋找相對路徑的文件時會以為根目錄,默認(rèn)為執(zhí)行啟動時所在的當(dāng)前目錄。在文件被添加到依賴圖中時,將其轉(zhuǎn)換稱為了模塊。配置中的兩個目標(biāo)。僅限高級用途,默認(rèn)情況下自動生成生成文件的文件名。

webpack

webpack現(xiàn)在是主要的打包工具了,現(xiàn)在網(wǎng)絡(luò)上也有很多資料可以學(xué)習(xí)了。這里主要整理了一些基礎(chǔ)概念,但沒有所有的寫,只是把之前遇到的問題記錄了一下。

本文的原文在我的博客中:github.com/RachelRen/b…

歡迎star

    概念

    基本概念

    簡單配置

    優(yōu)化

概念

webpack是一個js應(yīng)用程序的模塊化打包器,它將遞歸地構(gòu)建一個依賴關(guān)系圖,其中包括應(yīng)用程序需要的每個模塊,然后將所有模塊打包成少量的bundle.

entry

這個告訴webpack從哪里開始,并根據(jù)依賴關(guān)系圖確定需要打包的內(nèi)容。

module.exports = {
	entry: "./src/app/index.js"
}

語法

單個入口 entry: string|Array 當(dāng)這個entry中傳入數(shù)組時,就是創(chuàng)建了多個住入口。

對象語法 entry: {[entryChunkName: string]: string|Array}entry:{[]} 這種比較繁瑣,但是這種方法是最可擴(kuò)展的。

context

Webpack 在尋找相對路徑的文件時會以 context 為根目錄,context 默認(rèn)為執(zhí)行啟動webpack時所在的當(dāng)前目錄。

module.exports = {
  context: path.resolve(__dirname, "app")
}
output

告訴webpack在哪里打包應(yīng)用程序

	output: {
	    path: path.resolve(__dirname, "build"),
	    filename: "js/[name].js",
	    publicPath: "/",
	    chunkFilename:"js/[name].chunk.js",
		//chunkFilename:"js/[name].[chunkhash:8].chunk.js",
	},

這里 filename chunkFilename的區(qū)別?

chunkhashhash 的區(qū)別?

每次輸出都有什么樣的配置呢?

詳情請看我的另一篇博客 webpack之輸出

loader

因為webpack自身只理解Javascript,但是程序本身也需要處理(.css, .html, .scss, .jpg,etc.),所以webpack把這些文件都作為模塊來處理。 webpack loader在文件被添加到依賴圖中時,將其轉(zhuǎn)換稱為了模塊。webpack配置loader中的兩個目標(biāo)。

    識別出(identify)應(yīng)該被對應(yīng)的loader進(jìn)行轉(zhuǎn)換的那些文件(test屬性)

    轉(zhuǎn)換這些文件,從而使其能夠被添加到依賴圖中,并且最終添加到bundle中(use屬性)

module.exports = {
	module: {
		rules: [
			 test: /.html");"html-loader"
	        }
		]
	}
}

use可以跟一個數(shù)組,表示指定多個loader

loader的特性

loader可以時同步的,也可以是異步的

接受查詢參數(shù),用于對loader傳遞配置

能夠使用 options對象進(jìn)行配置

除了使用package.json常見的main屬性,還可以將普通的npm模塊導(dǎo)出為loader,做法是在packago.json里定義一個loader字段

插件可以為loader帶來更多特性

loader 模塊需要導(dǎo)出為一個函數(shù),并且使用Node.js兼容的Javascript編寫。通常使用npm進(jìn)行管理,但是也可以將自定義loader作為應(yīng)用程序中的文件。

關(guān)于loader的具體的詳細(xì)特征,可以看我的另一篇博客:webpack之Loader

plugins

因為loader只是每個文件的基本轉(zhuǎn)換,但是plugins主要用于在打包模塊的“compilation”和“chunk”生命周期執(zhí)行操作和自定義功能。使用插件需要require()它,然后把它添加到plugins的數(shù)組中,多數(shù)插件可以通過選項(option)自定義,也可以在一個配置文件中因為不同目的而多次使用同一個插件。

const config = {
  plugins: [
    new webpack.optimize.UglifyJsPlugin(),
    new HtmlWebpackPlugin({template: "./src/index.html"})
  ]
};

插件是一個具有apply屬性的javascript對象,apply屬性會被webpack compiler調(diào)用,并且compiler對象可在整個編譯生命周期訪問。

配置

webpack配置文件是導(dǎo)出一個對象的javascript文件,他是標(biāo)準(zhǔn)的nodejs CommonJs模塊,可以做以下事情

通過require(...)導(dǎo)入其他文件

通過require(...)使用npm的工具函數(shù)

使用JavaScript控制流表達(dá)式,如");操作符

編寫并執(zhí)行函數(shù)來生成部分配置

常用插件 ExtractTextPlugin

遇到的問題

參數(shù) 說明 類型
id 此插件實例的唯一 ident。(僅限高級用途,默認(rèn)情況下自動生成) String
filename 生成文件的文件名??赡馨?[name], [id] and [contenthash] string
allChunks 從所有額外的 chunk(additional chunk) 提?。J(rèn)情況下,它僅從初始chunk(initial chunk) 中提?。?/td>
當(dāng)使用 CommonsChunkPlugin 并且在公共 chunk 中有提取的 chunk(來自ExtractTextPlugin.extract)時,allChunks **必須設(shè)置為 true Boolean
ignoreOrder 禁用插件 Boolean
disable 禁用順序檢查 (這對 CSS 模塊很有用!),默認(rèn) false Boolean
extrat

ExtractTextPlugin.extract(options: loader | object)

從一個已存在的 loader 中,創(chuàng)建一個提取(extract) loader。支持的 loader 類型 { loader: [name]-loader -> {String}, options: {} -> {Object} }。

名稱 類型 描述
options.use {String}/{Array}/{Object} loader 被用于將資源轉(zhuǎn)換成一個 CSS 導(dǎo)出模塊 (必填)
options.fallback {String}/{Array}/{Object} loader(例如 "style-loader")應(yīng)用于當(dāng) CSS 沒有被提取(也就是一個額外的 chunk,當(dāng) allChunks: false)
options.publicPath {String} 重寫此 loader 的 publicPath 配置
const ExtractTextPlugin = require("extract-text-webpack-plugin");

module.exports = {
	module: {
		rules: [
			{
				test: /.css$/,
				use: ExtractTextPlugin.extract({
					fallback: "style-loader",
					use: [{
						loader: "css-loader",
						options: {
							importLoaders: 1
						}
					}]

				})

			},
			{
				test: /.scss");"style-loader",
					use: [{
						loader: "css-loader",
					}, {
						loader: "postcss-loader",
						options: {
							plugins: [require("autoprefixer")({
									broswers: ["last 3 version", "ie >= 10"]
								})]
						}
					}, {
						loader: "sass-loader",

					}]

				})
			}
		],
		plugins: [
			new ExtractTextPlugin({
			filename: "style.css", 
			allChunks: true,
			ignoreOrder: false,
			disable: false
		}),
		]
	}
}
HtmlWebpackPlugin

可以用這個插件生成一個html文件,使用lodash模版提供的模版,或者使用自己的loader

基本用法

var HtmlWebpackPlugin = require("html-webpack-plugin");

var webpackConfig = {
  entry: "index.js",
  output: {
    path: "dist",
    filename: "index_bundle.js"
  },
  plugins: [new HtmlWebpackPlugin()]
};

將生成一個/dist/index.html



  
    "UTF-8">
    webpack App
  
  
    
  

也可以使用模版,產(chǎn)生html,并將css插入到html中

new HtmlWebpackPlugin({
	filename: "index.html",
	template: paths.appHtml,
	// template: __dirname + "/src/app/index.html",
	inject: true,
	chunks: ["vendor", "index"], //會自動將js文件插入html中
	chunksSortMode: "dependency"
}),
CommonsChunkPlugin

是一個可選的用于建立一個獨(dú)立文件(又稱作 chunk)的功能,這個文件包括多個入口 chunk 的公共模塊.通過將公共模塊拆出來,最終合成的文件能夠在最開始的時候加載一次,便存起來到緩存中供后續(xù)使用。這個帶來速度上的提升,因為瀏覽器會迅速將公共的代碼從緩存中取出來,而不是每次訪問一個新頁面時,再去加載一個更大的文件。

new webpack.optimize.CommonsChunkPlugin({
			name: "vendor",
			filename: "vendor.bundle.js" //gave the chunk a different name
		}),
		

使用 CommonsChunkPlugin 為每個頁面間的應(yīng)用程序共享代碼創(chuàng)建 bundle。由于入口起點(diǎn)增多,多頁應(yīng)用能夠復(fù)用入口起點(diǎn)之間的大量代碼/模塊,從而可以極大地從這些技術(shù)中受益。

不過這個插件在Webpack 4 后就不用了。

webpack 4.0

    extract-text-webpack-plugin 不再支持

    構(gòu)建模式mode,必須配置這個屬性

    公共代碼提取:將CommonsChunkPlugin 直接改為optimization.splitChunks和optimization.runtimeChunk這兩個配置。

    壓縮上

    壓縮插件更新到 uglifyjs-webpack-plugin 1.0 版本,支持多進(jìn)程壓縮,緩存以及es6語法,無需多帶帶安裝轉(zhuǎn)換器。當(dāng) mode="production" 默認(rèn)開啟壓縮,無需配置??梢酝ㄟ^ optimization.minimize 和 optimization.minimizer 自定義配置。測試發(fā)現(xiàn),第二次打包時間是第一次打包的一半左右

Webpack 4 配置最佳實踐 webpack基本配置項總結(jié)

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

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

相關(guān)文章

  • Webpack坑位之輸出

    摘要:之輸出的最后就是為了得到打包結(jié)果。在這里可以看到很多相似,但是有不同含義的名次,如和,和,那他們有什么區(qū)別呢而這里的又是什么意思呢將多個模塊打包之后的代碼集合稱為。在這樣打包的話,會報錯。所以就想搞明白這兩個的區(qū)別到底是什么。webpack之輸出 webpack的最后就是為了得到打包結(jié)果。 那這是一個怎么樣的過程,不同的配置,會有什么樣的結(jié)果呢? 本文的原文在我的博客中:github.com...

    miqt 評論0 收藏0
  • Just for fun——迅速寫完快速排序

    摘要:快速排序快速排序的話,應(yīng)用了分治的思想,選取一個中間值,把小于它的值放左邊,大于它的值放右邊,然后再對這兩個分組應(yīng)用同樣的方法,遞歸下去。挖坑挖坑是自己快速回憶實現(xiàn)這個算法的形象叫法。 快速排序 快速排序的話,應(yīng)用了分治的思想,選取一個中間值,把小于它的值放左邊,大于它的值放右邊,然后再對這兩個分組應(yīng)用同樣的方法,遞歸下去。 挖坑 挖坑是自己快速回憶實現(xiàn)這個算法的形象叫法。如果現(xiàn)在有數(shù)...

    JowayYoung 評論0 收藏0
  • Just for fun——迅速寫完快速排序

    摘要:快速排序快速排序的話,應(yīng)用了分治的思想,選取一個中間值,把小于它的值放左邊,大于它的值放右邊,然后再對這兩個分組應(yīng)用同樣的方法,遞歸下去。挖坑挖坑是自己快速回憶實現(xiàn)這個算法的形象叫法。 快速排序 快速排序的話,應(yīng)用了分治的思想,選取一個中間值,把小于它的值放左邊,大于它的值放右邊,然后再對這兩個分組應(yīng)用同樣的方法,遞歸下去。 挖坑 挖坑是自己快速回憶實現(xiàn)這個算法的形象叫法。如果現(xiàn)在有數(shù)...

    alaege 評論0 收藏0
  • Just for fun——迅速寫完快速排序

    摘要:快速排序快速排序的話,應(yīng)用了分治的思想,選取一個中間值,把小于它的值放左邊,大于它的值放右邊,然后再對這兩個分組應(yīng)用同樣的方法,遞歸下去。挖坑挖坑是自己快速回憶實現(xiàn)這個算法的形象叫法。 快速排序 快速排序的話,應(yīng)用了分治的思想,選取一個中間值,把小于它的值放左邊,大于它的值放右邊,然后再對這兩個分組應(yīng)用同樣的方法,遞歸下去。 挖坑 挖坑是自己快速回憶實現(xiàn)這個算法的形象叫法。如果現(xiàn)在有數(shù)...

    weakish 評論0 收藏0

發(fā)表評論

0條評論

lidashuang

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<