国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開發(fā) > JS > 正文

淺談webpack對(duì)樣式的處理

2024-05-06 16:41:49
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本文介紹了webpack對(duì)樣式的處理,分享給大家,具體如下:

我們可以在js中引入樣式文件

require('myStyle.css')

這時(shí)我們便需要引入相應(yīng)的webpack loader來(lái)幫助我們解析這段代碼。

css-loader搭配style-loader

首先,我們可以引入css-loader和style-loader來(lái)處理css的解析,其中,css-loader是用來(lái)解析css文件,style-loader是用來(lái)將css文件嵌入到j(luò)s文件里

var path = require('path')module.exports = { context: path.join(__dirname, 'src') entry: './', module: { rules: [  {  test: //.css$/,  include: [   path.join(__dirname, 'src')  ],  use: ['style-loader', 'css-loader']  } ] }, output: {  path: path.join(__dirname, 'dist'),  filename: '[name].bundle.[hash].js' }}

在上面的代碼里,解析順序是從右到左解析,先使用css-loader解析出css文件之后,再使用style-loader嵌入到j(luò)s代碼里。

如果你使用less來(lái)寫樣式的話,則需要先用less-loader來(lái)編譯樣式文件為css文件,再繼續(xù)使用css-loader與style-loader。另外,loader加載器可以省略后面的-loader。所以上面的代碼可以縮寫成

module: { rules: [ {  test: //.css$/,  include: [  path.join(__dirname, 'src')  ],  use: ['style', 'css', 'less'] } ]}

一般在測(cè)試環(huán)境里為了快點(diǎn)編譯css,會(huì)用這種方式多一點(diǎn),但是這樣子編譯出來(lái)的js文件會(huì)比較大,不大適合在生產(chǎn)環(huán)境里使用。

編譯成單獨(dú)的文件

上面的做法會(huì)把css和js打包在一起,減少實(shí)際請(qǐng)求的次數(shù),但是由于編譯出來(lái)的js文件比較大,浪費(fèi)帶寬。因此,我們使用extract-text-webpack-plugin插件,把css文件編譯成獨(dú)立的文件。我們就可以利用CDN把這個(gè)文件推送到節(jié)點(diǎn)服務(wù)器,或者根據(jù)視情況按需加載,進(jìn)而優(yōu)化客戶請(qǐng)求鏈路,加速頁(yè)面響應(yīng)。

var path = require('path'), ExtractTextPlugin = require('extract-text-webpack-plugin')module.exports = { context: path.join(__dirname, 'src'), entry: './', module: { rules: [{  test: //.css$/,  include: [  path.join(__dirname, 'src')  ],  use: ExtractTextPlugin.extract({  fallback: 'style',  use: 'css'  }) }] }, output: {  path: path.join(__dirname, 'dist'),  filename: '[name].bundle.[hash].js' }, plugins: [ new ExtractTextPlugin('[name].css') ]}

通過(guò)上面的代碼,我們使用extract-text-webpack-plugin插件處理src目錄下所有的css文件,先使用css-loader插件解析出css代碼,如果解析失敗,使用style-loader插件解析,最終在dist目錄下生成對(duì)應(yīng)的js文件

兼容舊瀏覽器

以前我們寫樣式時(shí),有些樣式不同瀏覽器需要加不同的前綴,如-webkit-。現(xiàn)在有了構(gòu)建工具,我們便不需要再去關(guān)注這些前綴了,構(gòu)建工具會(huì)自動(dòng)幫我們加上這些前綴。

對(duì)于webpack我們自然想到需要使用loader或者plugin來(lái)幫助我們做這些事情,查了下發(fā)現(xiàn)autoprefixer-loader已經(jīng)廢棄不再維護(hù)了,推薦使用posscss

postcss是用于在js中轉(zhuǎn)換css樣式的js插件,需要搭配其他插件一起使用,這點(diǎn)和babel6一樣,本身只是個(gè)轉(zhuǎn)換器,并不提供代碼解析功能。

這里我們需要autoprefixer插件來(lái)為我們的樣式添加前綴。首先下載該模塊。

npm install -D autoprefixer

接著便可以配置webpack了

var autoprefixer = require('autoprefixer')module.exports = { ... module: { loaders: [  ...  {  {   test: //.css$/,   loader: ExtractTextPlugin.extract(["css", "postcss"])  },  } ] }, postcss: [autoprefixer()], ...}

查看一下抽取出來(lái)的樣式文件便可以發(fā)現(xiàn)已經(jīng)加上了前綴

a { display: flex;}/*compiles to:*/a { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex}

另外autoprefixer還可以根據(jù)目標(biāo)瀏覽器版本生成不同的前綴個(gè)數(shù),例如你的應(yīng)用的使用用戶如果大多數(shù)是使用比較新版本的瀏覽器,那么便可以做如下配置。

postcss: [autoprefixer({ browsers: ['last 2 versions'] })] 這是生成的樣式便會(huì)有些不一樣,還是上面的例子

a { display: flex;}/*compiles to:*/a { display: -webkit-flex; display: -ms-flexbox; display: flex;}

樣式壓縮

壓縮代碼我們可以使用webpack的內(nèi)置插件UglifyJsPlugin來(lái)做,它既可以壓縮js代碼也可以壓縮css代碼。

plugins: [ ... new webpack.optimize.UglifyJsPlugin({ compress: {  warnings: false } }), ...]

其實(shí)并不能說(shuō)是在壓縮css代碼,本質(zhì)來(lái)說(shuō)還是壓縮js代碼,再將這塊代碼輸出到css文件中。

使用CommonsChunkPlugin抽取公共代碼

首先要明確一點(diǎn)CommonsChunkPlugin是在有多個(gè)entry時(shí)使用的,即在有多個(gè)入口文件時(shí),這些入口文件可能會(huì)有一些共同的代碼,我們便可以將這些共同的代碼抽取出來(lái)成獨(dú)立的文件。明白這一點(diǎn)非常重要。(搞了很久才明白的一點(diǎn),唉~~~~)

如果在多個(gè)entry中require了相同的css文件,我們便可以使用CommonsChunkPlugin來(lái)將這些共同的樣式文件抽取出來(lái)為獨(dú)立的樣式文件。

module.exports = { entry: { "A": "./src/entry.js", "B": "./src/entry2.js" }, ... plugins: [ new webpack.optimize.CommonsChunkPlugin({ name: "commons", filename: "commons.js" }), ... ]}

當(dāng)然,這里不止會(huì)抽取共同的css,如果有共同的js代碼,也會(huì)抽取成為commons.js。 這里有個(gè)有趣的現(xiàn)象,抽取出來(lái)的css文件的命名將會(huì)是參數(shù)中name的值,而js文件名則會(huì)是filename的值。

CommonsChunkPlugin好像只會(huì)將所有chunk中都共有的模塊抽取出來(lái),如果存在如下的依賴

// entry1.jsvar style1 = require('./style/myStyle.css')var style2 = require('./style/style.css')// entry2.jsrequire("./style/myStyle.css")require("./style/myStyle2.css")// entry3.jsrequire("./style/myStyle2.css")

使用插件后會(huì)發(fā)現(xiàn),根本沒(méi)有生成commons.css文件。

如果我們只需要取前兩個(gè)chunk的共同代碼,我們可以這么做

module.exports = { entry: { "A": "./src/entry.js", "B": "./src/entry2.js", "C": "./src/entry3.js" }, ... plugins: [ new webpack.optimize.CommonsChunkPlugin({ name: "commons", filename: "commons.js", chunks: ['A', 'B'] }), ... ]}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到JavaScript/Ajax教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 新河县| 涞水县| 太仆寺旗| 班戈县| 巴彦县| 金秀| 商丘市| 长白| 芦溪县| 泾源县| 九台市| 西宁市| 兰坪| 西吉县| 四会市| 新郑市| 龙岩市| 巴彦淖尔市| 仙居县| 潢川县| 北安市| 永川市| 宁津县| 洞头县| 泾源县| 高碑店市| 孟村| 波密县| 开封市| 赤壁市| 荃湾区| 突泉县| 诸暨市| 南城县| 遂平县| 宜丰县| 定西市| 沅陵县| 台东市| 湟源县| 乌拉特中旗|