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

資訊專欄INFORMATION COLUMN

webpack多頁(yè)應(yīng)用架構(gòu)系列(五):聽說webpack連less/css也能打包?

Me_Kun / 2403人閱讀

摘要:用到什么了在多頁(yè)應(yīng)用架構(gòu)系列二配置常用部分有哪些里我就說過,的核心只能打包文件,而以外的資源都是靠進(jìn)行轉(zhuǎn)換或做出相應(yīng)的處理的。

本文首發(fā)于Array_Huang的技術(shù)博客——實(shí)用至上,非經(jīng)作者同意,請(qǐng)勿轉(zhuǎn)載。
原文地址:https://segmentfault.com/a/1190000006897458
如果您對(duì)本系列文章感興趣,歡迎關(guān)注訂閱這里:https://segmentfault.com/blog/array_huang
前言

過去講前端模塊化、組件化,更多還是停留在js層面,畢竟js作為一種更典型的程序語言,在這方面的想象和操作空間都更大一些。但近年來,組件化要求得更多了,HTML/CSS/JS這三件套一件可都不能少(甚至包括其它類型的資源,比如說圖片),而這樣的組件,無疑是高內(nèi)聚的。

文章簡(jiǎn)介

本文將介紹如何使用webpack來打包less/css(沒用過sass,但畢竟也是通過loader來加載的,相信與less無異),首先是介紹相關(guān)的webpack plugin&loader,然后將介紹如何加載不同應(yīng)用層次的less/css。

用到什么loader了?

在《webpack多頁(yè)應(yīng)用架構(gòu)系列(二):webpack配置常用部分有哪些?》里我就說過,webpack的核心只能打包js文件,而js以外的資源都是靠loader進(jìn)行轉(zhuǎn)換或做出相應(yīng)的處理的。下面我就來介紹打包less/css所需要的loader。

less-loader

針對(duì)less文件,我們首先需要使用less-loader來加載。less-loader會(huì)調(diào)用所依賴的less模塊對(duì)less文件進(jìn)行編譯(包括@import語法)。至于說less-loader所接受的參數(shù),實(shí)質(zhì)上大部分是傳遞給less模塊使用的參數(shù),由于我本人應(yīng)用less的程度不深,因此沒有傳任何參數(shù)、直接就使用了。如果你之前對(duì)less模塊就已經(jīng)有了一套配置的話,請(qǐng)參考less-loader的文檔進(jìn)行配置。

另外,less-loader并不會(huì)針對(duì)url()語法做特別的轉(zhuǎn)換,因此,如果你想把url()語句里涉及到的文件(比如圖片、字體文件等)也一并用webpack打包的話,就必須利用管道交給css-loader做進(jìn)一步的處理。

css-loader

針對(duì)css文件,我們需要使用css-loader來加載.css-loader的功能比較強(qiáng)大,一些新穎的特性比如Local Scope或是CSS Modules都是支持的。

我目前只用到了css-loader的壓縮功能(Minification),對(duì)于這個(gè)功能,有一點(diǎn)是需要注意的,那就是如果你的代碼里也和我一樣,有許多為了瀏覽器兼容性的廢棄CSS代碼的話,請(qǐng)務(wù)必關(guān)閉autoprefixer已避免你的廢棄CSS代碼被css-loader刪除了,形如css?minimize&-autoprefixer

上面提到css-loader會(huì)對(duì)url()語句做處理,這里稍微再說兩句。在less/css里的這url()語句,在css-loader看來,就跟require()語句是一樣的,只要在webpack配置文件里定義好加載各類型資源的loader,那這url()語句實(shí)際上什么資源都能處理。一般我在url()語句都會(huì)以相對(duì)路徑的方式(相對(duì)于此語句所在的less/css文件)來指定文件路徑;請(qǐng)不要使用以/開頭(即相對(duì)于網(wǎng)站根目錄,因?yàn)閷?duì)于文件系統(tǒng)來說,這明顯是令人混淆的)的路徑,盡管css-loader也可以通過設(shè)置root參數(shù)來適配。

postcss-loader

習(xí)慣用postcss的童鞋們有福啦,webpack可以通過postcss-loader來兼容postcss。由于postcss只算是一個(gè)加分項(xiàng),因此這里也不作過多介紹,只介紹一下如何把postcss撘進(jìn)webpack,不明白的童鞋麻煩先把postcss搞懂了再看。

放上我的腳手架項(xiàng)目的代碼:

var precss       = require("precss");
var autoprefixer = require("autoprefixer");

module.exports = {
    module: {
        loaders: [
            {
                test:   /.css$/,
                exclude: /node_modules|bootstrap/,
                loader: "css?minimize&-autoprefixer!postcss",
            }
        ]
    },
    postcss: function () {
        return [precss, autoprefixer({
            remove: false,
            browsers: ["ie >= 8", "> 1% in CN"],
        })];
    }
}

從loader的配置"css?minimize&-autoprefixer!postcss"上看,實(shí)際上就是先讓postcss-loader處理完了再傳遞給css-loader。而postcss項(xiàng)則是postcss-loader所接受的參數(shù),實(shí)際上就是返回一個(gè)包含你所需要的postcss"s plugins的數(shù)組啦,這些plugin有各自的初始化參數(shù),不過這些都是postcss的內(nèi)容了,這里就不做介紹了。

用到什么Plugin了?

加載less/css這一塊主要用到的是extract-text-webpack-plugin(下文簡(jiǎn)稱為ExtractTextPlugin吧),而且由于我用的是webpack 1,因此用的也是相對(duì)應(yīng)webpack 1的版本(1的文檔在這里不要搞錯(cuò)了哈)。

ExtractTextPlugin的作用是把各個(gè)chunk加載的css代碼(可能是由less-loader轉(zhuǎn)換過來的)合并成一個(gè)css文件并在頁(yè)面加載的時(shí)候以的形式進(jìn)行加載。

相對(duì)于使用style-loader直接把css代碼段跟js打包在一起并在頁(yè)面加載時(shí)以inline的形式插入DOM,我還是更喜歡ExtractTextPlugin生成并加載CSS文件的形式;倒不是看不慣inline的css,只是用文件形式來加載的話會(huì)快很多,尤其后面介紹用webpack來生成HTML的時(shí)候,這會(huì)直接生成在里,那么在CSS的加載上就跟傳統(tǒng)的前端頁(yè)面沒有差別了,體驗(yàn)非常棒。

ExtractTextPlugin的初始化參數(shù)不多,唯一的必填項(xiàng)是filename參數(shù),也就是如何來命名生成的CSS文件。跟webpack配置里的output.filename參數(shù)類似,這ExtractTextPlugin的filename參數(shù)也允許使用變量,包括[id]、[name]和[contenthash];理論上來說如果只有一個(gè)chunk,那么不用這些變量,寫死一個(gè)文件名也是可以的,但由于我們要做的是多頁(yè)應(yīng)用,必然存在多個(gè)chunk(至少每個(gè)entry都對(duì)應(yīng)一個(gè)chunk啦)。這里我是這么設(shè)置的:

new ExtractTextPlugin("[name]/styles.css"), // [name]對(duì)應(yīng)的是chunk的name,我在webpack配置中是這樣

[name]對(duì)應(yīng)的是chunk的name,我在webpack配置中把各個(gè)entry的name都按index/index、index/login這樣的形式來設(shè)置了,那么最后css的路徑就會(huì)像這樣:build/index/index/styles.css,也就是跟chunk的js文件放一塊了(js文件的路徑形如build/index/index/entry.js)。

除了要把這初始化后的ExtractTextPlugin放到webpack配置中的plugins參數(shù)里,我們還要在loader配置里做相應(yīng)的修改:

module.exports = {
    module: {
        loaders: [
            {
                test:   /.css$/,
                exclude: /node_modules|bootstrap/,
                loader: ExtractTextPlugin.extract("css?minimize&-autoprefixer!postcss"),
            }
        ]
    },
}

如此一來,ExtractTextPlugin就算是配置好了。

如何加載不同應(yīng)用層次的less/css

在我的設(shè)計(jì)中,有三種應(yīng)用層次的less/css代碼段:

基礎(chǔ)的、公用的代碼段,包括CSS框架、在CSS框架上進(jìn)行定制的CSS theme,基本上每個(gè)頁(yè)面都會(huì)應(yīng)用到這些CSS代碼段。

組件的代碼段,這里的組件指的是你自己寫的組件,而且組件本身含有js,并負(fù)責(zé)加載css以及其它邏輯。

每個(gè)頁(yè)面獨(dú)有的CSS代碼段,很可能只是對(duì)某些細(xì)節(jié)進(jìn)行微調(diào)。

首先來回顧一下我設(shè)計(jì)的文件目錄結(jié)構(gòu):

├─src # 當(dāng)前項(xiàng)目的源碼
    ├─pages # 各個(gè)頁(yè)面獨(dú)有的部分,如入口文件、只有該頁(yè)面使用到的css、模板文件等
    │  ├─alert # 業(yè)務(wù)模塊
    │  │  └─index # 具體頁(yè)面
    │  ├─index # 業(yè)務(wù)模塊
    │  │  ├─index # 具體頁(yè)面
    │  │  └─login # 具體頁(yè)面
    │  │      └─templates # 如果一個(gè)頁(yè)面的HTML比較復(fù)雜,可以分成多塊再拼在一起
    │  └─user # 業(yè)務(wù)模塊
    │      ├─edit-password # 具體頁(yè)面
    │      └─modify-info # 具體頁(yè)面
    └─public-resource # 各個(gè)頁(yè)面使用到的公共資源
        ├─components # 組件,可以是純HTML,也可以包含js/css/image等,看自己需要
        │  ├─footer # 頁(yè)尾
        │  ├─header # 頁(yè)頭
        │  ├─side-menu # 側(cè)邊欄
        │  └─top-nav # 頂部菜單
        ├─config # 各種配置文件
        ├─iconfont # iconfont的字體文件
        ├─imgs # 公用的圖片資源
        ├─layout # UI布局,組織各個(gè)組件拼起來,因應(yīng)需要可以有不同的布局套路
        │  ├─layout # 具體的布局套路
        │  └─layout-without-nav # 具體的布局套路
        ├─less # less文件,用sass的也可以,又或者是純css
        │  ├─base-dir
        │  ├─components-dir # 如果組件本身不需要js的,那么要加載組件的css比較困難,我建議可以直接用less來加載
        │  └─base.less # 組織所有的less文件
        ├─libs # 與業(yè)務(wù)邏輯無關(guān)的庫(kù)都可以放到這里
        └─logic # 業(yè)務(wù)邏輯
基礎(chǔ)代碼段

基礎(chǔ)的CSS代碼(實(shí)際上我的項(xiàng)目中用的都是less)我統(tǒng)一都放到src/public-resource/less目錄里。我使用一個(gè)抽象的文件base.less將所有的less文件組織起來(利用@import),這樣的話我用js加載起來就方便多了。

在我的腳手架項(xiàng)目(Array-Huang/webpack-seed)里,CSS框架我用的是bootstrap,并且使用了bootstrap-loader進(jìn)行加載,因此就沒有把bootstrap的CSS文件放到src/public-resource/less/base-dir目錄里,這個(gè)目錄里放的都是我定制的theme了。

src/public-resource/less/components-dir目錄放的是某些第三方組件所用到的css,又或是不含js的組件所用到的css。其實(shí)這部分CSS是否應(yīng)該歸在下一類,我也考慮良久,只是由于歸到下一類的話加載起來不方便,不方便原因如下:

某些第三方庫(kù)是要你自己加載CSS的,如果你打算寫適配器來封裝這些第三方庫(kù),那自然可以直接在適配器來加載CSS,這就屬于下一類了;然而,有一些使用起來很簡(jiǎn)單的庫(kù),你還寫適配器那就有點(diǎn)畫蛇添足了。

某些自己寫的組件可能僅包含HTML和CSS,那么誰來加載CSS?

所以干脆還是交由base.less一并加載了算了。

我設(shè)計(jì)了一個(gè)common.page.js,并在每一個(gè)頁(yè)面的入口文件里都首先加載這common.page.js,那么,只要我在這common.page.js里加載base.less,所有的頁(yè)面都能享受到這份基礎(chǔ)CSS代碼段。

組件代碼段

組件的代碼我都放在了src/public-resource/components,每一個(gè)組件統(tǒng)一放在一個(gè)獨(dú)立的目錄,并由該組件的js負(fù)責(zé)加載其CSS。

頁(yè)面代碼段

頁(yè)面獨(dú)有的CSS我自然是放在該頁(yè)面自己的目錄里,利用該頁(yè)面的入口文件進(jìn)行加載。

最終生成的CSS代碼都在哪?

由于我使用了ExtractTextPlugin,因此這些CSS代碼最終都會(huì)生成到所屬chunk的目錄里成為一個(gè)CSS文件。

基礎(chǔ)代碼段肯定是保存在CommonsChunkPlugin所生成的公共代碼chunk所在的目錄里了,在我的腳手架項(xiàng)目(Array-Huang/webpack-seed)里就是build/commons了(我的公共代碼chunk的name是"commons")。

組件代碼段看情況,該組件用的頁(yè)面多的話(大于CommonsChunkPlugin的minChunks參數(shù))就會(huì)被歸到跟基礎(chǔ)代碼段一起咯;反之,則哪個(gè)頁(yè)面用到它,就放到哪個(gè)頁(yè)面chunk的目錄里咯。

頁(yè)面代碼段就不用想了,肯定是在那個(gè)頁(yè)面chunk的目錄里了,畢竟才用了1次。

示例代碼

諸位看本系列文章,搭配我在Github上的腳手架項(xiàng)目食用更佳哦(笑):Array-Huang/webpack-seed(https://github.com/Array-Huang/webpack-seed)。

附系列文章目錄(同步更新)

webpack多頁(yè)應(yīng)用架構(gòu)系列(一):一步一步解決架構(gòu)痛點(diǎn):https://segmentfault.com/a/1190000006843916

webpack多頁(yè)應(yīng)用架構(gòu)系列(二):webpack配置常用部分有哪些?:https://segmentfault.com/a/1190000006863968

webpack多頁(yè)應(yīng)用架構(gòu)系列(三):怎么打包公共代碼才能避免重復(fù)?:https://segmentfault.com/a/1190000006871991

webpack多頁(yè)應(yīng)用架構(gòu)系列(四):老式j(luò)Query插件還不能丟,怎么兼容?:https://segmentfault.com/a/1190000006887523

webpack多頁(yè)應(yīng)用架構(gòu)系列(五):聽說webpack連less/css也能打包?:https://segmentfault.com/a/1190000006897458

webpack多頁(yè)應(yīng)用架構(gòu)系列(六):聽說webpack連圖片和字體也能打包?:https://segmentfault.com/a/1190000006907701

webpack多頁(yè)應(yīng)用架構(gòu)系列(七):開發(fā)環(huán)境、生產(chǎn)環(huán)境傻傻分不清楚?:https://segmentfault.com/a/1190000006952432

webpack多頁(yè)應(yīng)用架構(gòu)系列(八):教練我要寫ES6!webpack怎么整合Babel?:https://segmentfault.com/a/1190000006992218

webpack多頁(yè)應(yīng)用架構(gòu)系列(九):總有刁民想害朕!ESLint為你阻擊垃圾代碼:https://segmentfault.com/a/1190000007030775

webpack多頁(yè)應(yīng)用架構(gòu)系列(十):如何打造一個(gè)自定義的bootstrap:https://segmentfault.com/a/1190000007043716

webpack多頁(yè)應(yīng)用架構(gòu)系列(十一):預(yù)打包Dll,實(shí)現(xiàn)webpack音速編譯:https://segmentfault.com/a/1190000007104372

webpack多頁(yè)應(yīng)用架構(gòu)系列(十二):利用webpack生成HTML普通網(wǎng)頁(yè)&頁(yè)面模板:https://segmentfault.com/a/1190000007126268

webpack多頁(yè)應(yīng)用架構(gòu)系列(十三):構(gòu)建一個(gè)簡(jiǎn)單的模板布局系統(tǒng):https://segmentfault.com/a/1190000007159115

webpack多頁(yè)應(yīng)用架構(gòu)系列(十四):No復(fù)制粘貼!多項(xiàng)目共用基礎(chǔ)設(shè)施

webpack多頁(yè)應(yīng)用架構(gòu)系列(十五):論前端如何在后端渲染開發(fā)模式下夾縫生存

webpack多頁(yè)應(yīng)用架構(gòu)系列(十六):善用瀏覽器緩存,該去則去,該留則留

本文首發(fā)于Array_Huang的技術(shù)博客——實(shí)用至上,非經(jīng)作者同意,請(qǐng)勿轉(zhuǎn)載。
原文地址:https://segmentfault.com/a/1190000006897458
如果您對(duì)本系列文章感興趣,歡迎關(guān)注訂閱這里:https://segmentfault.com/blog/array_huang

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

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

相關(guān)文章

  • webpack多頁(yè)應(yīng)用架構(gòu)系列(六):聽說webpack圖片和字體也能打包

    摘要:本文首發(fā)于的技術(shù)博客實(shí)用至上,非經(jīng)作者同意,請(qǐng)勿轉(zhuǎn)載。原文地址如果您對(duì)本系列文章感興趣,歡迎關(guān)注訂閱這里前言上一篇聽說連也能打包說到使用來加載,這一篇來講講如何籠統(tǒng)地加載其它類型的資源。源文件內(nèi)容的,用于緩存解決方案。 本文首發(fā)于Array_Huang的技術(shù)博客——實(shí)用至上,非經(jīng)作者同意,請(qǐng)勿轉(zhuǎn)載。原文地址:https://segmentfault.com/a/119000000690...

    dayday_up 評(píng)論0 收藏0
  • webpack多頁(yè)應(yīng)用架構(gòu)系列(一):一步一步解決架構(gòu)痛點(diǎn)

    摘要:本文首發(fā)于的技術(shù)博客實(shí)用至上,非經(jīng)作者同意,請(qǐng)勿轉(zhuǎn)載。原文地址如果您對(duì)本系列文章感興趣,歡迎關(guān)注訂閱這里這系列文章講什么本系列文章主要介紹如何用這一當(dāng)前流行的構(gòu)建工具來設(shè)計(jì)一個(gè)多頁(yè)應(yīng)用的架構(gòu)。 本文首發(fā)于Array_Huang的技術(shù)博客——實(shí)用至上,非經(jīng)作者同意,請(qǐng)勿轉(zhuǎn)載。原文地址:https://segmentfault.com/a/1190000006843916如果您對(duì)本系列文章...

    Lowky 評(píng)論0 收藏0
  • webpack多頁(yè)應(yīng)用架構(gòu)系列(十):如何打造一個(gè)自定義的bootstrap

    摘要:我個(gè)人慣用的是,因此本文以為例來介紹如何打造一個(gè)自定義的。引入全局的方法請(qǐng)看我之前的這篇文章多頁(yè)應(yīng)用架構(gòu)系列四老式插件還不能丟,怎么兼容,我的腳手架項(xiàng)目也是使用的這套方案。 本文首發(fā)于Array_Huang的技術(shù)博客——實(shí)用至上,非經(jīng)作者同意,請(qǐng)勿轉(zhuǎn)載。原文地址:https://segmentfault.com/a/1190000007043716如果您對(duì)本系列文章感興趣,歡迎關(guān)注訂閱...

    jindong 評(píng)論0 收藏0
  • webpack多頁(yè)應(yīng)用架構(gòu)系列(十一):預(yù)打包Dll,實(shí)現(xiàn)webpack音速編譯

    摘要:本文首發(fā)于的技術(shù)博客實(shí)用至上,非經(jīng)作者同意,請(qǐng)勿轉(zhuǎn)載。原文地址如果您對(duì)本系列文章感興趣,歡迎關(guān)注訂閱這里前言書承上文多頁(yè)應(yīng)用架構(gòu)系列十如何打造一個(gè)自定義的。終于,發(fā)現(xiàn)了這一大殺器,打包時(shí)間過長(zhǎng)的問題得到完美解決。 本文首發(fā)于Array_Huang的技術(shù)博客——實(shí)用至上,非經(jīng)作者同意,請(qǐng)勿轉(zhuǎn)載。原文地址:https://segmentfault.com/a/119000000710437...

    sixleaves 評(píng)論0 收藏0
  • webpack多頁(yè)應(yīng)用架構(gòu)系列(三):怎么打包公共代碼才能避免重復(fù)?

    摘要:在上一篇文章多頁(yè)應(yīng)用架構(gòu)系列二配置常用部分有哪些中,我介紹了如何配置多頁(yè)應(yīng)用的入口,然而,如果僅僅如此操作,帶來的后果就是,打包生成出來的每一個(gè)入口文件都會(huì)完整包含所有代碼。的初始化常用參數(shù)有哪些,給這個(gè)包含公共代碼的命個(gè)名唯一標(biāo)識(shí)。 本文首發(fā)于Array_Huang的技術(shù)博客——實(shí)用至上,非經(jīng)作者同意,請(qǐng)勿轉(zhuǎn)載。原文地址:https://segmentfault.com/a/1190...

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

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

0條評(píng)論

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