【问题标题】:React: sass-loader not transpiling SCSS into CSSReact:sass-loader 没有将 SCSS 转换为 CSS
【发布时间】:2020-07-16 18:16:51
【问题描述】:

我有一个 react 应用程序,其中 CSS 文件工作正常。
我需要开始使用SCSS,所以进行以下更改:

  1. 安装node-sasssass-loader
  2. 将导入从 .css 更改为 .scss
  3. 将文件扩展名从 .css 更改为 .scss

但是我的页面没有正确加载:

当前行为:

预期行为:

我的代码:

package.json

{
  "name": "frontend",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@coreui/coreui": "^3.0.0",
    "@stardust-ui/docs-components": "^0.40.0",
    "axios": "^0.19.0",
    "bootstrap": "^4.4.1",
    "compass": "^0.1.1",
    "css-loader": "^3.4.2",
    "mdbreact": "^4.25.4",
    "prettier": "^1.6.1",
    "prop-types": "^15.7.2",
    "react": "^16.10.2",
    "react-bootstrap": "^1.0.0-beta.16",
    "react-bootstrap-sidebar": "0.0.1",
    "react-dom": "^16.10.2",
    "react-fixed-bottom": "^1.0.2",
    "react-modal": "^3.11.1",
    "react-rangeslider": "^2.2.0",
    "react-router-dom": "^5.1.2",
    "react-scripts": "^1.1.5",
    "reconnecting-websocket": "^4.2.0",
    "reconnectingwebsocket": "^1.0.0",
    "semantic-ui-react": "^0.88.2",
    "style-loader": "^1.1.3",
    "styled-components": "^4.4.1"
  },
  "scripts": {
    "start": "PORT=3000 react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test --env=jsdom",
    "eject": "react-scripts eject"
  },
  "devDependencies": {
    "node-sass": "^4.13.1",
    "sass-loader": "^8.0.2"
  }
}

我在 node_modules/react-scripts/config/webpack.config.dev.js 中注入了加载器的代码,如下所示:

// Process JS with Babel.
          {
            test: /\.(js|jsx|mjs)$/,
            include: paths.appSrc,
            loader: require.resolve('babel-loader'),
            options: {
              // @remove-on-eject-begin
              babelrc: false,
              presets: [require.resolve('babel-preset-react-app')],
              // @remove-on-eject-end
              // This is a feature of `babel-loader` for webpack (not Babel itself).
              // It enables caching results in ./node_modules/.cache/babel-loader/
              // directory for faster rebuilds.
              cacheDirectory: true,
            },
          },
          { 
            test: /\.scss$/, 
            loader: [
              "css-loader",
              "sass-loader"
            ]
          },

这是我的组件:

import React, { Component } from "react";
import '../../../general.scss';
import { Warning } from '../../../images/images_svg';

class Terminos extends Component{
  state = { error: false }

  saveAndContinue = () => {
    if(this.props.values.terminos) {
       this.props.nextStep()      
    }
    else {
       console.log(this.props.values.terminos_error)
       this.props.mandar_error('terminos_error')
    }     
  }

  render() { 
    return (
      <div className="formulario">
        <div className="formulario-seccion-titulo">
          <div className="formulario-seccion-barrita"/>
            <div className="formulario-seccion-content">
               Presentacion
            </div>
          </div>      
          <div className={this.props.values.terminos_error ? "formulario-seccion" : "formulario-seccion-red"}>
             La actual pandemia que afecta al mundo trae consecuencias a nivel sanitario, económico y social. Lo que está ocurriendo con el COVID impacta de lleno, no sólo en la salud física de las personas, sino que también afecta de forma clara y contundente su salud mental.<br/><br/>
             Ud. puede decidir si contestar o no la encuesta que sigue pero de hacerlo,acepta que los resultados de la misma sean compartidos con su empleador con el único fin de brindarle contención y asistencia. La encuesta debe completarse en las próximas 10 horas.<br/><br/>
             <input type="checkbox" 
               id="terminos" 
               className="formulario-checkbox"
               onChange={() => this.props.handleTerminos()}
               checked={this.props.values.terminos}
             />  
             <label className="formulario-checkbox-label" htmlFor="terminos"> 
               Acepto terminos y condiciones.
             </label>
             {this.props.values.terminos_error===false &&
                <div className="formulario-seccion-error">
                  <div className="formulario-seccion-error-logo" >
                    <Warning color="#d93025"/>
                  </div>
                    Debes aceptar los terminos y condiciones para continuar
                </div>
              }
           </div>
           <div className="formulario-footer">
             <button className="formulario-botones" onClick={this.saveAndContinue}>Siguiente</button>
           </div>
         </div>
       )    
    }
}

export default Terminos;

如果我将导入和文件扩展名从 .scss 更改为 .css 页面加载正确。
我正在使用 npm start 开发和测试代码。

【问题讨论】:

  • 是否有任何返回的错误您也可以分享?
  • 没有错误,控制台是干净的。就像里面的 css 根本不存在一样。

标签: css reactjs webpack sass mdbreact


【解决方案1】:

您是否使用 Create-React-App 创建了项目? 在这种情况下,您不需要 sass-loader,您只需要 node-sass,并将您的 CSS 样式导入您的根文件,扩展名为 .scss/sass,比如import '../example.scss',那么就需要配置webpack.config.js了。

请提供更多信息。

祝你有美好的一天。

【讨论】:

  • 是的,我已经使用 Create-React-App 创建了项目。正如您所说,我正在导入 scss 文件(检查问题中的组件代码)。路径是正确的,因为没有显示任何错误,如果我将导入和文件扩展名从 .scss 更改为 .css 页面加载正确。
  • 你使用第三方 CSS 框架还是 jquery 相关的东西?
  • 事实上,我真的很想知道,如果您使用create-react-app 启动您的项目,那么Webpack 应该已经配置好了。
  • 我使用了create-react-app,然后我创建了 webpack.config.js,因为我遇到了这个问题
  • 好的,所以我们正在处理更深层次的挑战。如果您仍在使用npm start 来启动您的应用程序,那么我希望您知道它实际上使用了react-scripts,它有一个Webpack config。因此,除非您运行npm eject,否则我相信您自己的Webpack config 根本不会被react 读取。它解释了为什么 .css 被加载而 .scss 没有被加载。如果您以正确的方式引入node-sasssass-loader,我们现在需要解决。一方面,与SCSS 合作后,我意识到node-sass 存在很多版本问题。您在安装时收到任何警告吗?
【解决方案2】:

Webpackversion 4 之前发生了巨大的变化

当我们使用create-react-app 时,它会安装兼容版本的Webpackreact-scripts 会利用它来捆绑您的文件,并在您运行npm start 时使用Webpack-server 作为开发服务器来提供它们。

  • 从您的 package.json 中删除 "webpack": "^3.11.0" 因为它已经被react-scripts安装了。

  • 1234563 /p>

否则,这里是What Webpack says about loaders

【讨论】:

  • 好的,我修改了webpack的配置,结果还是一样,谢谢
  • 请查看我对此问题的更新答案。如果您坚持create-react-app 的方法,只需安装node-sasssass-loader 就足够了。
【解决方案3】:

好的,我解决了这个问题,删除了 node-modules 文件夹、package-lock.json 以及 package.json 中的所有依赖项。然后我用npm install ... 重新安装了我的所有依赖项。我认为问题出在 react-scripts 模块,我从版本 1.1.5 升级到 3.4.1 。谢谢大家的回答。

【讨论】:

    猜你喜欢
    • 2018-02-19
    • 1970-01-01
    • 2012-05-24
    • 2017-12-06
    • 1970-01-01
    • 2012-11-18
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多