前面介绍了 webpack 的 loader 也提及了它是用来将各种语言转换成 js 的翻译器。但是有一个特殊的情况,就是有一个 style-loader 和 css-loader,他们并不是 js 但是最终可以以 text 的形式放到我们打包的那个文件 bundle.js 中去,并且这里是将两个 loader 一起使用,有点像是 filter & pipeline 的模式。虽然这里的 style-loader 并不知道为什么要单独分出来,听起来好像是 html 的 style 还可以有除了 css 之外的东西,不明觉厉。
css file | css-loader | style-loader > bundle.js当然,我们现在都不怎么写纯粹的 css 了,都是采用 less 或者是 sass 写了之后再翻译成 css,webpack 也支持 sass-loader 这样的东西,最终的流程是这样子的:
sass file | sass-loader | css-loader | style-loader > bundle.js首先安装 sass-loader 以及其所依赖的 sass to css 的翻译器 node-sass
$ npm install --save-dev sass-loader node-sass然后安装 style-loader 以及 css-loader
$ npm install --save-dev style-loader css-loader和配置 es2015 类似,在 webpack.config.js 中添加 loader
var path = require("path");
module.exports = {
entry: [
'./entry'
],
output: {
path: path.join(__dirname, "dist"),
filename: "bundle.js"
},
module: {
loaders: [
{
test: /\.js$/,
exclude: /node_modules/,
loader: "babel-loader",
query: {
presets: ['es2015']
}
},
{
test: /\.scss$/,
exclude: /node_modules/,
loader: "style!css!sass"
}
]
}
};这里的 loader 是一个 pipeline 的感觉,和 es2015 的有些不一样。多个 loader 以 ! 分隔,并且顺序是倒序的。
然后我们添加一个 styles 的目录,并且添加两个 scss 文件
.
├── dist
│ ├── bundle.js
│ └── index.html
├── entry.js
├── module1.js
├── module2.js
├── package.json
├── styles
│ ├── index.scss
│ └── theme.scss
└── webpack.config.jsindex.scss:
@import './theme.scss';theme.scss:
body {
background-color: yellow;
}这里只用了一个 @import 的 scss 语法,不过这样也应该足够验证 scss 了。
最后,在 entry.js 中添加对 index.scss 的引用。
import m1 from './module1'
import m2 from './module2'
require('./styles/index.scss')
m1();
m2();对的,不要怀疑,就是在 js 里面引入了 scss,npm start 一下,看看是不是 body 的背景色变了。
不过 css 和 js 放在一起总觉得怪怪的,可不可以拆分出来?当然可以了,这里需要一个额外的 webpack 插件。plugin 有点像是 webpack 的 postprocessor 是在 webpack 打包之后进行进一步处理的工具。这里我们用到了 extract-text-webpack-plugin 把 css 拆分出来放到一个单独的文件中。
首先安装
npm install --save-dev extract-text-webpack-plugin然后修改 webpack.config.js 注册这个插件
var path = require("path");
var ExtractTextPlugin = require("extract-text-webpack-plugin");
module.exports = {
entry: [
'./entry'
],
output: {
path: path.join(__dirname, "dist"),
filename: "bundle.js"
},
module: {
loaders: [
{
test: /\.js$/,
exclude: /node_modules/,
loader: "babel-loader",
query: {
presets: ['es2015']
}
},
{
test: /\.scss$/,
exclude: /node_modules/,
loader: ExtractTextPlugin.extract("style-loader", "css-loader", "sass-loader")
}
]
},
plugins: [
new ExtractTextPlugin("styles.css")
]
};注意,我们的 loader 这部分也会采用 ExtractTextPlugin 进行重写
loader: ExtractTextPlugin.extract("style-loader", "css-loader", "sass-loader")然后 plugin 这部分说明我们最终要将 css 文件保存为 styles.css,这里要说明的是 styles.css 文件是要遵循 webpack.config.js 文件中的 output 路径的,也就是说它会保存到 dist/styles.css。我们修改一下 index.html,引入这个文件
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
<link rel="stylesheet" href="styles.css" type="text/css" media="screen" title="no title" charset="utf-8">
</head>
<body>
<script type="text/javascript" src="bundle.js"></script>
</body>
</html>执行 webpack 看看是不是在 dist 下多了一个 styles.css。