我在使用webpack而不是Codekit v1.9.3时遇到了问题。我开始努力从CodeKit转移到Grunt和Gulp,然后了解webpack
这听起来很酷。我似乎无法让它正常工作。
javascript
语法coffeescript
bootstrap-sass
(scss)框架的组件$brand-primary
webpack --watch
在更改脚本和样式时自动编译它们Bower资源:
我目前在项目之外全球存储这些:
~/bower_components/twbs-bootstrap-sass/vendor/assets/stylesheets
因为CodeKit支持指南针,我在我的config.rb
文件中得到了这个:
add_import_path "~/bower_components/twbs-bootstrap-sass/vendor/assets/stylesheets"
项目结构
js/fancybox.js
js/main.js <-- currently the compiled js 'output' file
js/main.coffee
css/styles.css <-- currently the compiled css 'output' file
scss/styles.scss
scss/modules/_bootstrap-customizations.scss
scss/modules/_typography.scss
scss/partials/_header.scss
scss/partials/_footer.scss
styles.scss的内容
@import "modules/bootstrap-customizations"; # local customizations
@import "bootstrap/variables";
@import "bootstrap/mixins";
... # load bootstrap files as required
@import "bootstrap/wells";
节点已与自制程序brew install node
一起安装,但似乎工作正常。
我已阅读过这些页面:
我曾多次尝试创建webpack.config.js
文件,我的最新尝试是以下几个版本:
module.exports = {
entry: [
"./node_modules/bootstrap-sass-webpack!./bootstrap-sass.config.js",
"./js/main.coffee"
],
output: {
path: __dirname,
filename: "main.js"
},
module: {
loaders: [
{ test: /\.css$/, loader: "style!css" }
]
}
};
Webpack错误
当我运行webpack
时,我明白了:
ERROR in ./~/bootstrap-sass-webpack/~/css-loader!/Users/cwd/~/sass-loader!./~/bootstrap-sass-webpack/bootstrap-sass-styles.loader.js!./bootstrap-sass.config.js
stdin:1: file to import not found or unreadable: "~bootstrap-sass/assets/stylesheets/bootstrap/variables
NPM错误
我在尝试npm install bootstrap-sass
时遇到错误,在搜索解决方案时没有任何运气。我甚至不确定我是否需要这个模块。
npm ERR! Darwin 13.4.0
npm ERR! argv "node" "/usr/local/bin/npm" "install" "bootstrap-sass"
npm ERR! node v0.10.32
npm ERR! npm v2.1.7
npm ERR! code EPEERINVALID
npm ERR! peerinvalid The package bootstrap-sass does not satisfy its siblings' peerDependencies requirements!
npm ERR! peerinvalid Peer bootstrap-sass-webpack@0.0.3 wants bootstrap-sass@~3.2.0
npm ERR! Please include the following file with any support request:
npm ERR! /Users/cwd/webpack-test/npm-debug.log
对我来说最麻烦的webpack部分是:
require("bootstrap-sass-webpack")
之类的内容 - 是webpack.config.js
文件还是js/main.js
文件?npm install
npm install webpack -g
以便全局安装webpack,并使用npm install
而不使用-g
用于其他模块。但是,我没有在项目中看到任何node_modules
文件夹。难道不应该有吗?require("bootstrap-sass-webpack")
?我应该安装哪些节点模块才能执行此操作?我的webpack.config.js
应该是什么样的?
答案 0 :(得分:65)
Webpack主要是一个JavaScript-bundler。它的“本机”语言是JavaScript,其他所有源都需要一个将其转换为JavaScript的加载器。如果您require()
是一个html文件,例如......
var template = require("./some-template.html");
......你需要html-loader。它转过来......
<div>
<img src="./assets/img.png">
</div>
... INTO ...
module.exports = "<div>\n <img src=\"" + require("./assets/img.png") + "\">\n</div>";
如果加载器没有返回JavaScript,则需要将其“管道”到另一个加载器。
要使用SASS,您至少需要sass-loader和css-loader。 css-loader返回一个JavaScript字符串。如果您要将返回的JavaScript字符串导入为StyleSheet,则还需要style-loader。
运行npm i sass-loader css-loader style-loader --save
现在您需要在匹配/\.scss$/
的所有文件上应用这些加载器:
// webpack.config.js
...
module: {
loaders: [
// the loaders will be applied from right to left
{ test: /\.scss$/, loader: "style!css!sass" }
]
}
...
您还可以将选项作为查询参数传递给node-sass:
{
test: /\.scss$/, loader: "style!css!sass?includePaths[]=" +
path.resolve(__dirname, "./bower_components/bootstrap-sass/assets/stylesheets/"
}
由于bootstrap通过url()
语句引用图标,因此css-loader将尝试将这些资产包含在bundle中,否则将抛出异常。这就是为什么你还需要file-loader:
// webpack.config.js
...
module: {
loaders: [
{ test: /\.scss$/, loader: "style!css!sass" },
{ test: /\.jpe?g$|\.gif$|\.png$|\.svg$|\.woff$|\.ttf$/, loader: "file" },
]
}
...
要将bootstrap包含到您的包中,有几种方法。一个是通过多次进入选项,因为你已经尝试过。我建议您使用单个条目,在其中require()
使用主要的sass文件:
// main.js
require("./main.scss");
鉴于已配置includePaths
,您可以执行以下操作:
// main.scss
// Set the font path so that url() points to the actual file
$icon-font-path: "../../../fonts/bootstrap";
@import "bootstrap";
请注意,webpack不会触及scss文件中的import语句,因为libsass没有api(yet)来提供自定义解析器。
为防止代码重复,拥有单个主sass文件也很重要,因为webpack会单独编译每个sass文件。
通过npm安装咖啡加载器,您的最终webpack.config.js
应如下所示:
module.exports = {
entry: "./js/main.coffee",
output: {
path: __dirname,
filename: "main.js"
},
module: {
loaders: [
{ test: /\.scss$/, loader: "style!css!sass" },
{ test: /\.jpe?g$|\.gif$|\.png$|\.svg$|\.woff$|\.ttf$/, loader: "file" },
{ test: /\.coffee$/, loader: "coffee" }
]
}
};
最好不全局安装webpack,因为它是项目的依赖项,因此应该通过npm进行控制。您可以使用package.json
的<{3}} - 部分:
{
...
"scripts": {
"start": "webpack --config path/to/webpack.config.js & node server.js"
}
}
然后你只需要运行npm start