最近开始利用业余时间采用 react + redux 的前端架构山寨一个金数据(或者说是 WuFoo,毕竟两个东西看起来真的很像)以增加自己对这些框架的熟练度。在这个过程中记录下一些自己遇到的坑。今天就是一个 webpack 如何和 bootstrap 结合的坑。
为了在项目之初就一个不是那么丑的界面,都会选择一些比较成熟的前端 css 框架。bootstrap 是比较流行的一个。bootstrap 一方面是基本的 css 另一方面还有一些 jQuery 的插件形式的类库支持其中的一些组件,当然还有一些它所需要的字体文件。那么这里问题就来了:
webpack 中引入 jQuery 以及它的插件webpack 引入一些其他类型的文件,例如字体首先,我们还是要安装 bootstrap 以及它所依赖的 jquery。
npm install --save bootstrap-sass jquery这里顺便说一句,虽然 jquery 看似过时了,但是它所构建的生态是非常庞大的,尤其是像 jquery-ui 这样的东西可以说是一些富交互应用所必须的。那么如何将 react 的 component 和 jquery 的一些组件很好的结合是在选择 react 这样的框架之初就考虑进去的。后面在涉及到一些复杂的交互的时候会出现 jquery-ui 与 react 一起使用的例子。
然后,我们可以在 webpack.config.js 中以 entry 的形式引入 bootstrap-loader
var path = require("path");
module.exports = {
devtool: 'cheap-module-source-map',
entry: [
'bootstrap-loader',
'./index.js'
],
output: {
path: path.join(__dirname, "dist"),
filename: "bundle.js"
},
module: {
loaders: [
{
test: /\.js$/,
exclude: /node_modules/,
loader: "babel-loader"
},
{
test: /\.scss$/,
exclude: /node_modules/,
loader: "style!css!sass"
}
]
}
};注意看 entry 本来就是一个数组,我们可以在这里引入多个入口。
做了一番调研之后发现其实没必要自己把所有的事情都做了,有这么一个 bootstrap-loader 可以帮助在 webpack 的项目中引入 bootstrap。
npm install --save-dev bootstrap-loader不过单单是安装它是不过的,其实 bootstrap-loader 所做的事情就是帮助我们把各种样子的文件引入到我们的项目中,那么为了处理不同类型的文件需要一些其他的 loader 的支持(前面的博客有提及 webpack 只能处理 js 如果需要处理其他类型的东西就需要 loader 的帮助)。这里,我们还要引入一大堆的 loader。
npm install --save-dev resolve-url-loader url-loader file-loader imports-loader其中 file-loader 用于加载其他类型的文件,url-loader 和 file-loader 类似,只是在文件比较小的时候返回 Data Url 的形式。resolve-url-loader 和之前提到的 sass-loader 一起使用,用于处理 sass 中 url() 的路径。这些 loader 都要和 webpack.config.js 中的 loaders 配置项配合使用:
var path = require("path");
module.exports = {
...
module: {
loaders: [
...
{
test: /\.woff2?(\?v=[0-9]\.[0-9]\.[0-9])?$/,
loader: "url?limit=10000"
},
{
test: /\.(ttf|eot|svg)(\?[\s\S]+)?$/,
loader: 'file'
}
]
}
};imports-loader 是个很有意思的 loader 它定义了一个简单的格式用于引入使用它的类库所需要的依赖。
module.exports = {
...
module: {
loaders: [
...
{
test: /bootstrap-sass\/assets\/javascripts\//,
loader: 'imports?jQuery=jquery'
}
]
}
};如上所示,在 webpack.config.js 中加入这样一个 loader。其中说明在引入 bootstrap 下的 javascripts 时,为他们提供 jQuery 这样的变量。那么 imports-loader 会在引入 bootstrap 的 js 之前为他们提供如下的代码:
var jQuery = require('jquery');估计在后续使用 jquery 的其他东西的时候还会用到它的。