淺談webpack對樣式的處理
本文介紹了webpack對樣式的處理,分享給大家,具體如下:
我們可以在js中引入樣式文件
require('myStyle.css')
這時(shí)我們便需要引入相應(yīng)的webpack loader來幫助我們解析這段代碼。
css-loader搭配style-loader
首先,我們可以引入css-loader和style-loader來處理css的解析,其中,css-loader是用來解析css文件,style-loader是用來將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來寫樣式的話,則需要先用less-loader來編譯樣式文件為css文件,再繼續(xù)使用css-loader與style-loader。另外,loader加載器可以省略后面的-loader。所以上面的代碼可以縮寫成
module: { rules: [ { test: /\.css$/, include: [ path.join(__dirname, 'src') ], use: ['style', 'css', 'less'] } ] }
一般在測試環(huán)境里為了快點(diǎn)編譯css,會用這種方式多一點(diǎn),但是這樣子編譯出來的js文件會比較大,不大適合在生產(chǎn)環(huán)境里使用。
編譯成單獨(dú)的文件
上面的做法會把css和js打包在一起,減少實(shí)際請求的次數(shù),但是由于編譯出來的js文件比較大,浪費(fèi)帶寬。因此,我們使用extract-text-webpack-plugin插件,把css文件編譯成獨(dú)立的文件。我們就可以利用CDN把這個(gè)文件推送到節(jié)點(diǎn)服務(wù)器,或者根據(jù)視情況按需加載,進(jìn)而優(yōu)化客戶請求鏈路,加速頁面響應(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') ] }
通過上面的代碼,我們使用extract-text-webpack-plugin插件處理src目錄下所有的css文件,先使用css-loader插件解析出css代碼,如果解析失敗,使用style-loader插件解析,最終在dist目錄下生成對應(yīng)的js文件
兼容舊瀏覽器
以前我們寫樣式時(shí),有些樣式不同瀏覽器需要加不同的前綴,如-webkit-?,F(xiàn)在有了構(gòu)建工具,我們便不需要再去關(guān)注這些前綴了,構(gòu)建工具會自動幫我們加上這些前綴。
對于webpack我們自然想到需要使用loader或者plugin來幫助我們做這些事情,查了下發(fā)現(xiàn)autoprefixer-loader已經(jīng)廢棄不再維護(hù)了,推薦使用posscss
postcss是用于在js中轉(zhuǎn)換css樣式的js插件,需要搭配其他插件一起使用,這點(diǎn)和babel6一樣,本身只是個(gè)轉(zhuǎn)換器,并不提供代碼解析功能。
這里我們需要autoprefixer插件來為我們的樣式添加前綴。首先下載該模塊。
npm install -D autoprefixer
接著便可以配置webpack了
var autoprefixer = require('autoprefixer') module.exports = { ... module: { loaders: [ ... { { test: /\.css$/, loader: ExtractTextPlugin.extract(["css", "postcss"]) }, } ] }, postcss: [autoprefixer()], ... }
查看一下抽取出來的樣式文件便可以發(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'] })] 這是生成的樣式便會有些不一樣,還是上面的例子
a { display: flex; } /*compiles to:*/ a { display: -webkit-flex; display: -ms-flexbox; display: flex; }
樣式壓縮
壓縮代碼我們可以使用webpack的內(nèi)置插件UglifyJsPlugin來做,它既可以壓縮js代碼也可以壓縮css代碼。
plugins: [ ... new webpack.optimize.UglifyJsPlugin({ compress: { warnings: false } }), ... ]
其實(shí)并不能說是在壓縮css代碼,本質(zhì)來說還是壓縮js代碼,再將這塊代碼輸出到css文件中。
使用CommonsChunkPlugin抽取公共代碼
首先要明確一點(diǎn)CommonsChunkPlugin是在有多個(gè)entry時(shí)使用的,即在有多個(gè)入口文件時(shí),這些入口文件可能會有一些共同的代碼,我們便可以將這些共同的代碼抽取出來成獨(dú)立的文件。明白這一點(diǎn)非常重要。(搞了很久才明白的一點(diǎn),唉~~~~)
如果在多個(gè)entry中require了相同的css文件,我們便可以使用CommonsChunkPlugin來將這些共同的樣式文件抽取出來為獨(dú)立的樣式文件。
module.exports = { entry: { "A": "./src/entry.js", "B": "./src/entry2.js" }, ... plugins: [ new webpack.optimize.CommonsChunkPlugin({ name: "commons", filename: "commons.js" }), ... ] }
當(dāng)然,這里不止會抽取共同的css,如果有共同的js代碼,也會抽取成為commons.js。 這里有個(gè)有趣的現(xiàn)象,抽取出來的css文件的命名將會是參數(shù)中name的值,而js文件名則會是filename的值。
CommonsChunkPlugin好像只會將所有chunk中都共有的模塊抽取出來,如果存在如下的依賴
// entry1.js var style1 = require('./style/myStyle.css') var style2 = require('./style/style.css') // entry2.js require("./style/myStyle.css") require("./style/myStyle2.css") // entry3.js require("./style/myStyle2.css")
使用插件后會發(fā)現(xiàn),根本沒有生成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'] }), ... ] }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
簡單了解JavaScript彈窗實(shí)現(xiàn)代碼
這篇文章主要介紹了簡單了解JavaScript彈窗實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05關(guān)于Vue中postcss-pxtorem的使用詳解
在Web開發(fā)領(lǐng)域,響應(yīng)式設(shè)計(jì)已經(jīng)成為一個(gè)不可或缺的趨勢,PostCSS插件——postcss-pxtorem的出現(xiàn)為我們提供了一種更加智能和高效的解決方案,本文將深入探討postcss-pxtorem的使用,包括其背后的原理、配置選項(xiàng)、實(shí)際應(yīng)用中的注意事項(xiàng)等方面,需要的朋友可以參考下2023-12-12用于CSS代碼壓縮與格式化的javascript函數(shù)代碼
呵呵,發(fā)現(xiàn)只要幾行JS代碼就可實(shí)現(xiàn)css的壓縮與格式化,非常不錯(cuò)。2009-12-12weui框架實(shí)現(xiàn)上傳、預(yù)覽和刪除圖片功能代碼
weui框架暫時(shí)只有css文件,并沒有js文件實(shí)現(xiàn)其功能,我在其html+css后面增加了js實(shí)現(xiàn)其功能,為大家提供方便,也為自己保存記錄。具體實(shí)例代碼大家參考下本文2017-08-08javascript實(shí)現(xiàn)選中復(fù)選框后相關(guān)輸入框變灰不可用的方法
這篇文章主要介紹了javascript實(shí)現(xiàn)選中復(fù)選框后相關(guān)輸入框變灰不可用的方法,涉及javascript針對頁面元素屬性的相關(guān)操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08javascript實(shí)現(xiàn)圖片跟隨鼠標(biāo)移動效果的方法
這篇文章主要介紹了javascript實(shí)現(xiàn)圖片跟隨鼠標(biāo)移動效果的方法,涉及javascript鼠標(biāo)事件及頁面元素的相關(guān)操作技巧,需要的朋友可以參考下2015-05-05