CSS-模块 类 在 React 服务器端渲染时未定义
CSS-Module classes are undefined while React server side rendering
我没有为 React SSR 使用 Webpack 配置。相反,这是我的配置:
require("@babel/register")({
presets: ["@babel/preset-env", "@babel/preset-flow", "@babel/preset-react"],
plugins: [
"@babel/plugin-transform-runtime",
"@babel/plugin-proposal-class-properties",
"babel-plugin-dynamic-import-node",
"@babel/plugin-transform-modules-commonjs",
[
"module-resolver",
{
root: ["./src"]
}
]
]
});
require("ignore-styles");
module.exports = require("./server.js");
问题是 css 类 在呈现的 html 中未定义。我该如何解决这个问题?
以上配置是针对只处理JS的Babel。如果你想在没有 webpack 的情况下使用 CSS-modules,那么你仍然需要将你的 CSS 处理成可以在 bowsers 中工作的格式。
最好的 css 处理器称为 PostCSS,它们是 CSS-模块支持的插件
我终于把这个插件添加到 babel:
[
"css-modules-transform",
{
camelCase: true,
extensions: [".css", ".scss"],
preprocessCss: "./ssr/utils/SsrCssModuleHandler.js",
generateScopedName: "[hash:base64:5]"
}
]
其中SsrCssModuleHandler是一个模块:
var sass = require('node-sass');
var path = require('path');
module.exports = function processSass(data, filename) {
var result;
result = sass.renderSync({
data: data,
file: filename
}).css;
return result.toString('utf8');
};
问题解决了!
我没有为 React SSR 使用 Webpack 配置。相反,这是我的配置:
require("@babel/register")({
presets: ["@babel/preset-env", "@babel/preset-flow", "@babel/preset-react"],
plugins: [
"@babel/plugin-transform-runtime",
"@babel/plugin-proposal-class-properties",
"babel-plugin-dynamic-import-node",
"@babel/plugin-transform-modules-commonjs",
[
"module-resolver",
{
root: ["./src"]
}
]
]
});
require("ignore-styles");
module.exports = require("./server.js");
问题是 css 类 在呈现的 html 中未定义。我该如何解决这个问题?
以上配置是针对只处理JS的Babel。如果你想在没有 webpack 的情况下使用 CSS-modules,那么你仍然需要将你的 CSS 处理成可以在 bowsers 中工作的格式。
最好的 css 处理器称为 PostCSS,它们是 CSS-模块支持的插件
我终于把这个插件添加到 babel:
[
"css-modules-transform",
{
camelCase: true,
extensions: [".css", ".scss"],
preprocessCss: "./ssr/utils/SsrCssModuleHandler.js",
generateScopedName: "[hash:base64:5]"
}
]
其中SsrCssModuleHandler是一个模块:
var sass = require('node-sass');
var path = require('path');
module.exports = function processSass(data, filename) {
var result;
result = sass.renderSync({
data: data,
file: filename
}).css;
return result.toString('utf8');
};
问题解决了!