构建同构 React 应用程序时如何处理 SASS 的导入?

Posted

技术标签:

【中文标题】构建同构 React 应用程序时如何处理 SASS 的导入?【英文标题】:How to handle import of SASS when building isomorphic React app? 【发布时间】:2019-06-06 17:52:20 【问题描述】:

我目前拥有支持 s-s-r 的 React 应用程序的当前设置:

反应应用 通过 webpack 编译 React 应用的 Express 服务器 使用 babel-node 运行具有 ES6 特性等的 Express 应用

一切正常,我启动了 Express 应用程序,它编译了我的 React 应用程序等。但是 - 然后我开始将 CSS 模块添加到 React 应用程序,然后当然一切都崩溃了,仅在服务器端课程。当我的 .scss 文件被导入 React 应用程序时,它不知道如何处理它们。

如果我们忘记了 CSS 部分,一切都会按照我的意愿进行。我可以在“开发模式”下运行整个应用程序,其中我有热重载等,babel-node 正在转换我的 ES6 节点代码等。

我已经设置了一个构建脚本,它将节点源编译为有效的 ES5,并且 React 应用程序被捆绑到一个文件中。都很好。

但是我应该如何才能保持我的设置,但是在没有 Node 的情况下工作的 CSS 模块抱怨它不理解该代码?

我想出的中途解决方案是,当我为生产构建所有内容时,我告诉 babel 跳过我的 serverRender.js 文件(这是导入我的 App.js 的文件,使用 renderToString 等,而是使用 Webpack 编译该特定文件(使用 isomorphic-style-loadercss-loader 等),并将其输出到我的“服务器”文件夹/结构的正确文件夹中。这可行,但感觉不对。 然后如果我回到在开发模式下运行,我基本上又会遇到同样的问题,如果我不为那部分开发设置 Webpack...

谁能告诉我进行此设置的更好方法?

【问题讨论】:

【参考方案1】:

我在使用同构 React 应用程序时遇到了同样的问题。无论我尝试了什么,我都遇到了这里描述的问题:SCSS compilation in an isomorphic React app 或以下错误:

错误:模块解析失败:意外令牌 (1:0) 您可能需要适当的加载程序来处理此文件类型。

我能够通过将 isomorphic-style-loader 包添加到 webpack 中的服务器配置来解决问题。 这是 webpack 的客户端配置:

    var browserConfig = 
       //usual stuff
       module: 
         rules: [
         //... ,
         
            test: /\.scss$/,
            use: [
                
                    loader: 'style-loader',
                ,
                
                    loader: 'css-loader',
                    options: 
                        modules: true, //turns on the CSS Module mode
                        importLoaders: 1,
                        localIdentName: '[name]__[local]___[hash:base64:5]', //generates CSS class names
                        sourceMap: true
                    
                ,
                
                    loader: 'sass-loader'
                
            ]
        
    ]

;

和服务器配置:

var serverConfig =  
   //...
   module: 
    rules: [
     //... ,
    
            test: /\.scss$/,
            use: [
                    
                        loader: 'isomorphic-style-loader',
                    ,
                    
                        loader: 'css-loader',
                        options: 
                            modules: true,
                            importLoaders: 1,
                            localIdentName: '[name]__[local]___[hash:base64:5]',
                            sourceMap: true
                    
                ,
                               
                        loader: 'sass-loader'
                
            ]
        
    ]
,

有了这些配置,我就可以用简单的样式创建 styles.scss:

$blueColor: #2196F3;

.component 
    background: $blueColor;

在JS文件中导入:

import myStyles from './styles.scss';

并在 render() 的 React 组件中使用它:

<div className= myStyles.component >

此解决方案由 DigitalKwarts 友情提供,您可以在此处找到有关此解决方案的更多详细信息:https://blog.digitalkwarts.com/server-side-rendering-with-reactjs-react-router-v4-react-helmet-and-css-modules/

让我知道它是否对你有用,或者你能想出更好的解决方案。

【讨论】:

【参考方案2】:

我阅读了@Galina 的答案,这很棒。我使用他提到的文章设置了一个样板: https://***.com/a/68600509/6200607

webpack.config.js 的配置:

const path = require('path');
const isDevelopment = true;

module.exports = [
  
    name: 'client',
    target: 'web',
    entry: './client.jsx',
    output: 
      path: path.join(__dirname, 'static'),
      filename: 'client.js',
      publicPath: '/static/',
    ,
    resolve: 
      extensions: ['.js', '.jsx']
    ,
    devtool: 'source-map',
    module: 
      rules: [
        
          test: /\.(js|jsx)$/,
          exclude: /(node_modules\/)/,
          use: [
            
              loader: 'babel-loader',
            
          ]
        ,
        
          test: /\.scss$/,
          use: [
            
              loader: 'style-loader',
            ,
            
              loader: "css-loader",
              options: 
                modules: 
                  localIdentName: "[name]__[local]___[hash:base64:5]",
                ,
                sourceMap: isDevelopment,
              
            ,
            
              loader: 'sass-loader'
            
          ]
        
      ],
    ,
  ,
  
    name: 'server',
    target: 'node',
    entry: './server.jsx',
    output: 
      path: path.join(__dirname, 'static'),
      filename: 'server.js',
      libraryTarget: 'commonjs2',
      publicPath: '/static/',
    ,
    devtool: 'source-map',
    resolve: 
      extensions: ['.js', '.jsx']
    ,
    module: 
      rules: [
        
          test: /\.(js|jsx)$/,
          exclude: /(node_modules\/)/,
          use: [
            
              loader: 'babel-loader',
            
          ]
        ,
        
          test: /\.scss$/,
          use: [
            
              loader: 'isomorphic-style-loader',
            ,
            
              loader: "css-loader",
              options: 
                modules: 
                  localIdentName: "[name]__[local]___[hash:base64:5]",
                ,
                sourceMap: isDevelopment,
              
            ,
            
              loader: 'sass-loader'
            
          ]
        
      ],
    ,
  
];

【讨论】:

以上是关于构建同构 React 应用程序时如何处理 SASS 的导入?的主要内容,如果未能解决你的问题,请参考以下文章

登录时如何处理状态(Ionic、Firebase、AngularJS)?

协同过滤程序:当没有足够的数据时如何处理 Pearson 分数

运行 Mongoose 时执行 ajax 调用时如何处理 Node.js 发现

当您尝试去混淆奇怪的代码时如何处理名称冲突?

使用组件依赖时如何处理多个 Dagger 组件

应用关闭时如何处理 UNNotificationAction?