Sass 加载器在 webpack 中不工作
Sass loader not working in webpack
我试图让我的 webpack 配置支持 *.scss 文件,但是当我 运行 webpack 构建命令时,我不断收到以下错误:
ERROR in ./~/css-loader!./~/sass-loader!./app/styles.scss
Module build failed: TypeError: Cannot read property 'sections' of null
at new SourceMapConsumer (/Users/sean/Development/playground/webpack.sass.test/node_modules/css-loader/node_modules/postcss/node_modules/source-map/lib/source-map/source-map-consumer.js:23:21)
at PreviousMap.consumer (/Users/sean/Development/playground/webpack.sass.test/node_modules/css-loader/node_modules/postcss/lib/previous-map.js:37:34)
at new Input (/Users/sean/Development/playground/webpack.sass.test/node_modules/css-loader/node_modules/postcss/lib/input.js:42:28)
at parse (/Users/sean/Development/playground/webpack.sass.test/node_modules/css-loader/node_modules/postcss/lib/parse.js:17:17)
at new LazyResult (/Users/sean/Development/playground/webpack.sass.test/node_modules/css-loader/node_modules/postcss/lib/lazy-result.js:54:47)
at Processor.process (/Users/sean/Development/playground/webpack.sass.test/node_modules/css-loader/node_modules/postcss/lib/processor.js:30:16)
at processCss (/Users/sean/Development/playground/webpack.sass.test/node_modules/css-loader/lib/processCss.js:168:24)
at Object.module.exports (/Users/sean/Development/playground/webpack.sass.test/node_modules/css-loader/lib/loader.js:21:15)
@ ./app/styles.scss 4:14-117
我这辈子都想不通为什么。这是一个非常基本的设置。
我创建了一个 Dropbox 共享,其中包含最低限度的说明:
https://www.dropbox.com/s/quobq29ngr38mhx/webpack.sass.test.zip?dl=0
然后解压 运行:
npm install
webpack
这是我的 webpack.config.js 文件:
var path = require('path')
var webpack = require('webpack')
module.exports = {
devtool: 'eval',
entry: [
'./app'
],
output: {
path: path.join(__dirname, 'dist'),
filename: 'index.js',
publicPath: '/dist/'
},
plugins: [
new webpack.NoErrorsPlugin()
],
resolve: {
extensions: ['', '.js']
},
module: {
loaders: [{
test: /\.scss$/,
loader: 'style-loader!css-loader!sass-loader'
}]
}
}
和 index.js 入口文件:
require('./styles.scss');
alert('foo bar baz');
和 styles.scss 文件:
body {
background-color: #000;
}
它似乎遵循了 sass-loader 文档站点的建议,但我无法将其下载到 运行。
:(
关于我的环境的信息:
node - 0.12.4
npm - 2.10.1
os - OS X Yosemite
遇到同样的问题后,我发现了这个:https://github.com/webpack/css-loader/issues/84
显然,目前的解决方案是手动将 /node_modules/css-loader/lib/loader.js 的第 17-19 行修改为
if(map && typeof map !== "string") {
map = JSON.stringify(map);
}
这解决了我的问题。
我已经设法找到另一个解决方法,它不涉及在我的 npm_modules 目录中编辑 css-loader 库(根据@chriserik 的回答)。
如果将“?sourceMap”添加到 sass 加载程序,css 加载程序似乎可以处理输出。
这是我更新后的配置:
var path = require('path')
var webpack = require('webpack')
module.exports = {
devtool: 'eval',
entry: [
'./app'
],
output: {
path: path.join(__dirname, 'dist'),
filename: 'index.js',
publicPath: '/dist/'
},
plugins: [
new webpack.NoErrorsPlugin()
],
resolve: {
extensions: ['', '.js']
},
module: {
loaders: [{
test: /\.scss$/,
loader: 'style!css!sass?sourceMap'
}]
}
}
P.S。我什至扩展了这个测试以包括一个 compass-mixins include,这也很有效。
问题通过将 source-map
选项设置为 true 来解决(如其他答案中所示)。
但如果您发现查询字符串中的传递选项乱七八糟,还有一个选择;
为了配置 sass 加载器,你可以在 webpack 配置对象中创建一个 sassLoader
属性:
module.exports = {
devtool: 'eval',
entry: [
'./app'
],
output: {
path: path.join(__dirname, 'dist'),
filename: 'index.js',
publicPath: '/dist/'
},
plugins: [
new webpack.NoErrorsPlugin()
],
resolve: {
extensions: ['', '.js']
},
module: {
loaders: [{
test: /\.scss$/,
loader: 'style!css!sass'
// loader: ExtractPlugin.extract('style', 'css!sass'),
}]
},
sassLoader: {
sourceMap: true
},
}
我试图让我的 webpack 配置支持 *.scss 文件,但是当我 运行 webpack 构建命令时,我不断收到以下错误:
ERROR in ./~/css-loader!./~/sass-loader!./app/styles.scss
Module build failed: TypeError: Cannot read property 'sections' of null
at new SourceMapConsumer (/Users/sean/Development/playground/webpack.sass.test/node_modules/css-loader/node_modules/postcss/node_modules/source-map/lib/source-map/source-map-consumer.js:23:21)
at PreviousMap.consumer (/Users/sean/Development/playground/webpack.sass.test/node_modules/css-loader/node_modules/postcss/lib/previous-map.js:37:34)
at new Input (/Users/sean/Development/playground/webpack.sass.test/node_modules/css-loader/node_modules/postcss/lib/input.js:42:28)
at parse (/Users/sean/Development/playground/webpack.sass.test/node_modules/css-loader/node_modules/postcss/lib/parse.js:17:17)
at new LazyResult (/Users/sean/Development/playground/webpack.sass.test/node_modules/css-loader/node_modules/postcss/lib/lazy-result.js:54:47)
at Processor.process (/Users/sean/Development/playground/webpack.sass.test/node_modules/css-loader/node_modules/postcss/lib/processor.js:30:16)
at processCss (/Users/sean/Development/playground/webpack.sass.test/node_modules/css-loader/lib/processCss.js:168:24)
at Object.module.exports (/Users/sean/Development/playground/webpack.sass.test/node_modules/css-loader/lib/loader.js:21:15)
@ ./app/styles.scss 4:14-117
我这辈子都想不通为什么。这是一个非常基本的设置。
我创建了一个 Dropbox 共享,其中包含最低限度的说明: https://www.dropbox.com/s/quobq29ngr38mhx/webpack.sass.test.zip?dl=0
然后解压 运行:
npm install
webpack
这是我的 webpack.config.js 文件:
var path = require('path')
var webpack = require('webpack')
module.exports = {
devtool: 'eval',
entry: [
'./app'
],
output: {
path: path.join(__dirname, 'dist'),
filename: 'index.js',
publicPath: '/dist/'
},
plugins: [
new webpack.NoErrorsPlugin()
],
resolve: {
extensions: ['', '.js']
},
module: {
loaders: [{
test: /\.scss$/,
loader: 'style-loader!css-loader!sass-loader'
}]
}
}
和 index.js 入口文件:
require('./styles.scss');
alert('foo bar baz');
和 styles.scss 文件:
body {
background-color: #000;
}
它似乎遵循了 sass-loader 文档站点的建议,但我无法将其下载到 运行。
:(
关于我的环境的信息:
node - 0.12.4
npm - 2.10.1
os - OS X Yosemite
遇到同样的问题后,我发现了这个:https://github.com/webpack/css-loader/issues/84
显然,目前的解决方案是手动将 /node_modules/css-loader/lib/loader.js 的第 17-19 行修改为
if(map && typeof map !== "string") {
map = JSON.stringify(map);
}
这解决了我的问题。
我已经设法找到另一个解决方法,它不涉及在我的 npm_modules 目录中编辑 css-loader 库(根据@chriserik 的回答)。
如果将“?sourceMap”添加到 sass 加载程序,css 加载程序似乎可以处理输出。
这是我更新后的配置:
var path = require('path')
var webpack = require('webpack')
module.exports = {
devtool: 'eval',
entry: [
'./app'
],
output: {
path: path.join(__dirname, 'dist'),
filename: 'index.js',
publicPath: '/dist/'
},
plugins: [
new webpack.NoErrorsPlugin()
],
resolve: {
extensions: ['', '.js']
},
module: {
loaders: [{
test: /\.scss$/,
loader: 'style!css!sass?sourceMap'
}]
}
}
P.S。我什至扩展了这个测试以包括一个 compass-mixins include,这也很有效。
问题通过将 source-map
选项设置为 true 来解决(如其他答案中所示)。
但如果您发现查询字符串中的传递选项乱七八糟,还有一个选择;
为了配置 sass 加载器,你可以在 webpack 配置对象中创建一个 sassLoader
属性:
module.exports = {
devtool: 'eval',
entry: [
'./app'
],
output: {
path: path.join(__dirname, 'dist'),
filename: 'index.js',
publicPath: '/dist/'
},
plugins: [
new webpack.NoErrorsPlugin()
],
resolve: {
extensions: ['', '.js']
},
module: {
loaders: [{
test: /\.scss$/,
loader: 'style!css!sass'
// loader: ExtractPlugin.extract('style', 'css!sass'),
}]
},
sassLoader: {
sourceMap: true
},
}