我已经创建了一个空白的React项目,使用命令:npx create-react-app在npm v7.0.7和Node.js v15.0.1

安装:

v17.0.1反应, node-sass v5.0.0,

然后我尝试导入一个空白的.scss文件到App组件:

文件App.js

import './App.scss'

function App() {
  return (
    <div className="App">
      App
    </div>
  );
}

export default App;

它抛出一个错误:

Failed to compile.

./src/App.scss (./node_modules/css-loader/dist/cjs.js??ref--5-oneOf-6-1!./node_modules/postcss-loader/src??postcss!./node_modules/resolve-url-loader??ref--5-oneOf-6-3!./node_modules/s
ass-loader/dist/cjs.js??ref--5-oneOf-6-4!./src/App.scss)
Error: Node Sass version 5.0.0 is incompatible with ^4.0.0.

文件package.json

{
  "name": "react-17-node-sass-5",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@testing-library/jest-dom": "^5.11.5",
    "@testing-library/react": "^11.1.0",
    "@testing-library/user-event": "^12.1.10",
    "node-sass": "^5.0.0",
    "react": "^17.0.1",
    "react-dom": "^17.0.1",
    "react-scripts": "4.0.0",
    "web-vitals": "^0.2.4"
  },
 ...

  }
}

当前回答

删除纱线。在项目中锁定文件 而且

yarn remove node-sass
yarn add node-sass

其他回答

在app.js或任何导入css的地方,确保导入css而不是scss。包中的脚本。Json会创建一个CSS文件,这就是应该导入的。

    "scss": "node-sass --watch -include-path src/scss -o src/css"

这个脚本将监视src中名为scss的文件夹中的一个scss文件。然后它会在src中创建一个css文件夹,并在该文件夹中添加一个css文件,这是你应该在app.js中导入的文件

运行脚本:

npm run scss

文件结构示例: src / scss / styles.scss

由脚本创建的CSS文件: src / css / styles。css

node-sass即LibSass将于2020年10月26日正式弃用,取而代之的是你应该使用sass即Dart sass。

对于npm,你可以这样做:

npm uninstall node-sass
npm install sass --save-dev

对于纱线,请:

yarn remove node-sass
yarn add sass

你可以直接切换到Sass,因为node-sass现在已经被弃用了。

在你的包裹里。json文件:

"node-sass": "npm:sass@^1.49.9",

在移除node-sass并将其替换为Sass之后,React仍然需要node-sass,所以你可以像这样为它命名,现在React将使用Sass。

博士TL;

NPM卸载node-sass NPM安装sass

或者,如果使用Yarn

纱线拆卸节点 纱加纱

Edit3:是的,另一个编辑。转移到sass (dart-sass)是最好的解决方案。之前的版本包括将node-sass锁定到4.x版本。x,它有2年的历史,缺乏较新的SCSS特征。


Edit2: sass-loader v10.0.5修复了它。问题是,您可能不会将其用作项目依赖项,而更多地是用作依赖项的依赖项。CRA使用一个固定的版本,angular-cli locks到node-sass v4等等。

目前的建议是:如果只安装node-sass,请检查下面的解决方案(以及说明)。如果你在一个空白的项目上工作,你可以管理你的Webpack配置(不使用CRA或CLI来支撑你的项目),安装最新的sass-loader。


编辑:这个错误来自于sass-loader。存在语义版本不匹配,因为node-sass @latest是v5.0.0,而sass-loader期望^4.0.0。

他们的存储库存在一个未解决的问题,需要审查相关的修复程序。在此之前,请参考下面的解决方案。


解决方案:先不要安装node-sass 5.0.0(主版本刚刚被撞了)。

卸载node-sass

NPM卸载node-sass

然后安装最新版本(5.0之前)

NPM安装node-sass@4.14.1


注意:LibSass(因此node-sass也是)已弃用,dart-sass是推荐的实现。你可以使用sass,它是一个Node.js发行版的dart-sass,编译成纯JavaScript。

你得到这样错误的唯一原因,是因为你的Node.js版本与node-sass版本不兼容。

因此,请确保在node-sass处签出文档。

或者下面这张图片将帮助你决定哪个Node.js版本可以使用node-sass版本。

例如,如果你在Windows系统上使用Node.js版本12(“可能”),那么你应该安装node-sass版本4.12。

npm install node-sass@4.12

是的,就像这样。所以现在你只需要安装node-sass团队推荐的node-sass版本,并在你的计算机上安装Node.js版本。