其他链接:
代码Github
地址:
当然了,webpack
也可以对CSS
文件进行打包,将其作为模块引入到JavaScript
代码中,然后利用Loader
输出。本篇文章主要针对的就是对CSS
的操作。
引入CSS
我们还是利用第二课的例子,但是我们不打算用HtmlWebpackPlugin
插件。我们新建一个index.html
文件,放在dist
文件夹中(因为我们将它作为build
的结果文件夹)。
<!--index.html-->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Webpack template demo</title>
</head>
<body>
<div>
<p>I am Webpack.</p>
</div>
<script src="bundle.js"></script>
</body>
</html>
在app
文件夹中,我们新建一个css
文件夹用来存放样式文件style.css
。
/*style.css*/
body {
background-color: red;
}
我们将背景定义为红色。接着,我们要在index.js
入口文件import
css
文件。
//index.js
import './css/style.css';
function component () {
var element = document.createElement('div');
element.innerHTML = "Hello World!";
return element;
}
document.body.appendChild(component());
到此,我们的基础文件已经安排好了。要使得webpack
能识别css
文件。我们需要Loader
,分别是css-loader
和style-loader
。css-loader
用来返回有@import
和url()
的css
文件,style.css
用来将css
文件插入页面。
有关
css-loader
和style-loader
的更多讨论,可参考stackoverflow
的问题:http://stackoverflow.com/questions/34039826/webpack-style-loader-vs-css-loader
我们这样来安装Loader
依赖。
npm install --save-dev css-loader style-loader
在webpack.config.js
中配置如下
//webpack.config.js
var path = require('path');
module.exports = {
entry: './app/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist')
},
//style-loader 和 css-loader
module: {
rules: [{
test: /\.css$/,
use: [ 'style-loader', 'css-loader' ]
}]
},
devServer: {
contentBase: path.join(__dirname, "dist"),
inline: true
}
};
test
指的是给出一个正则表达式,找到以.css
为后缀的样式文件。use
中定义了style-loader
和css-loader
,使用方式是从右往左,所以style-loader
在前,css-loader
在后。
我们开启了WDS
(Webpack Dev Server),并配置contentBase
参数,将服务器定向于dist
文件。默认情况下,WDS
会服务于根目录。inline
参数在dev-server
的两种模式间切换,true
就是inline
模式,修改文件就会重载浏览器窗口;false
代表iframe
模式;默认为inline
模式。
让我们开启服务器
$ npm run build && npm run start
这时,在8080
端口,我们看到了文字下面的红色背景。
更多有关
css-loader
设置的问题,请参考https://doc.webpack-china.org/loaders/css-loader/,尤其是有关css
作用域和css module
的内容,因为默认情况下,CSS
将所有的类名暴露到全局的选择器作用域中。css module
就是启用局部作用域CSS
。
ExtractTextWebpackPlugin插件
上面的做法有一个性能上的问题,就是无法使用浏览器去异步并并行地加载CSS
。反而,你的文件需要等待整个JavaScript
文件加载完,才能进行渲染。但是在我们的网页设计中,有一种平稳退化的概念。就是说,HTML
是最重要的,其次是CSS
,最后是JavaScript
。
所以呢,这个插件的作用就是将CSS
单独打包,然后交给浏览器率先加载。
首先,我们对插件进行开发依赖安装
$ npm install --save-dev extract-text-webpack-plugin
然后,我们需要修改我们的webpack.config.js
配置文件:
//webpack.config.js
var path = require('path');
var ExtractTextPlugin = require('extract-text-webpack-plugin');
module.exports = {
entry: './app/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist')
},
module: {
rules: [{
test: /\.css$/,
//use: [ 'style-loader', 'css-loader' ]
use: ExtractTextPlugin.extract({
use: 'css-loader'
})
}]
},
//ExtractTextPlugin
plugins: [
new ExtractTextPlugin('styles.css'),
],
devServer: {
contentBase: path.join(__dirname, "dist"),
inline: true
}
};
这样的设置下,webpack
会在dist
文件夹中生成一个汇总的styles.css
文件。你需要将它作为一个单独的样式加入到index.html
中。