webpack 單入口項(xiàng)目基礎(chǔ)配置教程(五)

這次我們來處理一下 解析 css/sass 的需求
首先需要兩個 loader

yarn add style-loader css-loader --dev

css-loader 作用是使你能夠使用類似 @import 和 url(...) 的方法實(shí)現(xiàn) require 的功能

style-loader 會生成一個內(nèi)容為最終解析完的 css 代碼的 style 標(biāo)簽,放到head標(biāo)簽里

簡單來講, css-loader 加載 css 文件, style-loader 使用 <style> 將 css-loader 內(nèi)部樣式注入到我們的 HTML 頁面

修改 webpack.config.js 文件

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
    entry: './src/app.jsx',
    output: {
        path: path.join(__dirname, 'dist'),
        filename: 'app.js'
    },
    module: {
        rules: [
            {
                test: /\.jsx$/,
                exclude: /(node_modules)/,
                use: {
                    loader: 'babel-loader',
                    options: {
                        presets: ['env', 'es2015', 'react']
                    }
                }
            },
+            {
+                test: /\.css$/,
+                use: [
+                    'style-loader',
+                    'css-loader'
+                ]
+            }
        ]
    },
    plugins: [
        new HtmlWebpackPlugin({
            title: 'MY-WEBPACK',
            template: './src/index.html'
        })
    ]
};

也注意一下, use 里面所使用的 loader 執(zhí)行順序是從右往左, 所以這里我們會先用 css-loader 解析 css 文件, 然后再用 style-loader 把解析后的 css 文件注入到 html 中

新建一個 ./src/index.css 文件

#app {
    color: red;
}

修改 app.jsx

import React from 'react';
import ReactDOM from 'react-dom';
+  import './index.css'

ReactDOM.render(
    <h1>Hello, world!</h1>,
    document.getElementById('app')
);

到了這一步實(shí)際就完成了 css 的解析, 但是這里有個很大的問題

我們看下 css 被解析成了什么 (在 dist/app.js 里)

.push([e.i,"#app {\r\n    color: red;\r\n}\r\n",""])}

上面這段我們可以看出來, css 被解析成了一段 js 然后直接做了一個 push 的動作

依據(jù)頁面的加載順序, 這段 css 其實(shí)會等所有的 js 都執(zhí)行完才會進(jìn)行渲染, 在實(shí)際的表現(xiàn)中我們的頁面會有一個白屏或是無樣式期, 然后才渲染成最后我們所期望的表象, 這很明顯不是我們所期望的結(jié)果

處理這個問題, 首先需要這個插件

yarn add extract-text-webpack-plugin --dev

它會將所有的入口 chunk(entry chunks)中引用的 *.css畦贸,移動到獨(dú)立分離的 CSS 文件殴蓬。因此松邪,你的樣式將不再內(nèi)嵌到 JS bundle 中,而是會放到一個單獨(dú)的 CSS 文件(即 index.css)當(dāng)中怠苔。 如果你的樣式文件大小較大曲掰,這會做更快提前加載,因?yàn)?CSS bundle 會跟 JS bundle 并行加載男杈。

修改一下 webpack.config.js 文件

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
+  const ExtractTextPlugin = require("extract-text-webpack-plugin");

module.exports = {
    entry: './src/app.jsx',
    output: {
        path: path.join(__dirname, 'dist'),
        filename: 'app.js'
    },
    module: {
        rules: [
            {
                test: /\.jsx$/,
                exclude: /(node_modules)/,
                use: {
                    loader: 'babel-loader',
                    options: {
                        presets: ['env', 'es2015', 'react']
                    }
                }
            },
            {
                test: /\.css$/,
+                use: ExtractTextPlugin.extract({
+                    fallback: "style-loader",
+                    use: "css-loader"
+                })
            }
        ]
    },
    plugins: [
        new HtmlWebpackPlugin({
            title: 'MY-WEBPACK',
            template: './src/index.html'
        }),
+        new ExtractTextPlugin("index.css"),
    ]
};

use 里的修改看起來奇怪, 但是作用還是先執(zhí)行 css-loader 再執(zhí)行 style-loader

plugins 里我們構(gòu)造 ExtractTextPlugin 實(shí)例的時候傳入了 index.css 作為參數(shù), 作用是指定打包后的 css bundle 名

然后可以重新指令運(yùn)行了

node_modules./bin/webpack

但是這里可能會報(bào)錯

Error: Chunk.entrypoints: Use Chunks.groupsIterable and filter by instanceof Entrypoint instead at Chunk.get(...)

解決方案是

yarn add extract-text-webpack-plugin@next --dev

這個問題是因?yàn)?extract-text-webpack-plugin 目前還沒有 webpack4 版本

有興趣可以去這個網(wǎng)址看看 有一些有意思的討論 https://github.com/webpack-contrib/extract-text-webpack-plugin/issues/701

重新指令運(yùn)行打包以后 dist 文件夾里就會出現(xiàn) index.css 文件了, 我們在 index.html 里也會看到 style 標(biāo)簽引入了這個 css 文件

css 就搞定了 接著是 sass (less 我就不寫了 沒啥區(qū)別)


安裝

yarn add sass-loader node-sass --dev

node-sass 是一定要裝的, 它是 sass-loader 的依賴

但是 node-sass 二進(jìn)制文件的下載源在墻外, 所以你可能需要翻墻 或者換 yarn 的下載源等等方法 這里不細(xì)寫了

修改 webpack.config.js

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const ExtractTextPlugin = require("extract-text-webpack-plugin");

module.exports = {
    entry: './src/app.jsx',
    output: {
        path: path.join(__dirname, 'dist'),
        filename: 'app.js'
    },
    module: {
        rules: [
            {
                test: /\.jsx$/,
                exclude: /(node_modules)/,
                use: {
                    loader: 'babel-loader',
                    options: {
                        presets: ['env', 'es2015', 'react']
                    }
                }
            },
            {
                test: /\.css$/,
                use: ExtractTextPlugin.extract({
                    fallback: "style-loader",
                    use: "css-loader"
                })
            },
+            {
+                test: /\.scss$/,
+                use: ExtractTextPlugin.extract({
+                    fallback: 'style-loader',
+                    use: ['css-loader', 'sass-loader']
+                })
+            }
        ]
    },
    plugins: [
        new HtmlWebpackPlugin({
            title: 'MY-WEBPACK',
            template: './src/index.html'
        }),
        new ExtractTextPlugin("index.css"),
    ]
};

修改 app.jsx

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
+  import './index.scss';

ReactDOM.render(
    <h1>Hello, world!</h1>,
    document.getElementById('app')
);

新增 ./src/index.scss

body {
    background-color: black;
    #app {
        font-size: 30px;
    }
}

然后打包 你會看到 src/index.scss 和 src/index.css 的內(nèi)容都被解析后丟進(jìn)了 dist/index.css 文件里

接著處理下 圖片和字體

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市调俘,隨后出現(xiàn)的幾起案子伶棒,更是在濱河造成了極大的恐慌泉瞻,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件苞冯,死亡現(xiàn)場離奇詭異,居然都是意外死亡侧巨,警方通過查閱死者的電腦和手機(jī)舅锄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來司忱,“玉大人皇忿,你說我怎么就攤上這事√谷裕” “怎么了鳍烁?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長繁扎。 經(jīng)常有香客問我幔荒,道長,這世上最難降的妖魔是什么梳玫? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任爹梁,我火速辦了婚禮,結(jié)果婚禮上提澎,老公的妹妹穿的比我還像新娘姚垃。我一直安慰自己,他們只是感情好盼忌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布积糯。 她就那樣靜靜地躺著,像睡著了一般谦纱。 火紅的嫁衣襯著肌膚如雪看成。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天服协,我揣著相機(jī)與錄音绍昂,去河邊找鬼。 笑死偿荷,一個胖子當(dāng)著我的面吹牛窘游,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播跳纳,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼忍饰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了寺庄?” 一聲冷哼從身側(cè)響起艾蓝,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤力崇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后赢织,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體亮靴,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年于置,在試婚紗的時候發(fā)現(xiàn)自己被綠了茧吊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡八毯,死狀恐怖搓侄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情话速,我是刑警寧澤讶踪,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站泊交,受9級特大地震影響乳讥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜廓俭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一雏婶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧白指,春花似錦留晚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至橄唬,卻和暖如春赋焕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仰楚。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工隆判, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人僧界。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓侨嘀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親捂襟。 傳聞我的和親對象是個殘疾皇子咬腕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容