我最近从Webpack 3升级到4.它现在抛出一个错误:
模块解析失败:意外字符'@'您可能需要一个 适当的加载器来处理这种文件类型。 | @进口 ” ./scss/variables.scss'; | | * {@ ./src/index.js 1:0-22
在我的styles.scss文件中,我正在执行以下操作:
@import 'scss/variables.scss';
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: Arial, Helvetica, sans-serif;
}
在我的index.js文件中,我只执行以下操作:
import './style.scss';
在我的webpack.dev.js中,我改变的是添加模式:'development':
const StyleLintPlugin = require('stylelint-webpack-plugin');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const Dotenv = require('dotenv-webpack');
module.exports = {
mode: 'development',
entry: './src/index.js',
output: {
filename: 'public/bundle.js'
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
loader: ['babel-loader', 'eslint-loader']
},
{
test: /\.scss$/,
loader: ExtractTextPlugin.extract(['css-loader', 'sass-loader'])
}
]
},
plugins: [
new StyleLintPlugin({
configFile: '.stylelintrc',
context: 'src',
files: '**/*.scss',
failOnError: false,
quiet: false,
syntax: 'scss'
}),
new ExtractTextPlugin('public/style.css'),
new Dotenv()
]
};
我不知道从Webpack 3到4有什么变化导致了这个错误。
我遇到的问题与此处发布的问题非常相似:Webpack 4 Module parse failed: Unexpected character '@' (1:0)
我已经完成了所有相关的stackoverflow问题,但没有一个问题有帮助。
以下是package.json中的相关依赖项:
"babel-loader": "^7.1.4",
"css-loader": "^0.28.11",
"eslint-loader": "^1.9.0",
"extract-text-webpack-plugin": "^4.0.0-beta.0",
"node-sass": "^4.9.0",
"sass-loader": "^6.0.7",
"style-loader": "^0.20.3",
"stylelint-webpack-plugin": "^0.10.5",
"uglifyjs-webpack-plugin": "^1.2.5",
"webpack": "^4.8.3",
"webpack-cli": "^2.1.4"
以下是我的package.json文件中的相关脚本,供评论中参考:
"scripts": {
"watch": "./node_modules/.bin/webpack --mode development --watch --progress",
"build": "./node_modules/.bin/webpack --mode production"
},
答案 0 :(得分:3)
问题是我用来运行Webpack的脚本没有指定配置文件。这应该是它的样子:
"scripts": {
"watch": "./node_modules/.bin/webpack --watch --config webpack.dev.js",
},
我认为这会产生@import问题,因为它没有像上面那样指定配置文件而没有加载css-loader,它使用的默认Webpack开发配置不包括css-loader。
答案 1 :(得分:1)
正如我在对您的问题的评论中提到的,Webpack 4兼容性存在一个未解决的问题:https://github.com/webpack-contrib/extract-text-webpack-plugin/issues/701
现在的修复是安装库的alpha版本。我刚刚做了一个小设置来测试它,它适用于webpack 4。
安装alpha版本npm i -D extract-text-webpack-plugin@next --save
。然后安装css-loader
,sass-loader
和node-sass
。
然后在webpack配置文件中:
const ExtractTextPlugin = require('extract-text-webpack-plugin');
...
module: {
rules: [
{
test: /\.(js|jsx)$/,
use: {
loader: 'babel-loader'
},
exclude: /node_modules/,
include: path.join(__dirname, 'src')
},
{
test: /\.scss$/,
loader: ExtractTextPlugin.extract(['css-loader', 'sass-loader'])
}
]
},
plugins: [
new ExtractTextPlugin('bundle.css'),
]
这对我来说非常有效,并且还连接了多个使用@import
语句的scss文件。
在package.json中它应该看起来像
"extract-text-webpack-plugin": "^4.0.0-beta.0",
"webpack": "^4.8.3"
修改:正如附注,显然mini-css-extract-plugin可以正常使用webpack 4。