问题描述
这是使用 antd(Ant Design)使用 create-react-app (CRA) 创建的 React 应用程序。现有项目已被修改以尝试进行服务器端渲染 (SSR)。
npm run build
工作正常。
在那之后是错误发生的时候。 npm start
:
/Users/user/dev/reactappname/node_modules/antd/lib/style/index.less:1
@import './themes/index';
^
SyntaxError: Invalid or unexpected token
at Module._compile (internal/modules/cjs/loader.js:895:18)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:995:10)
at Module.load (internal/modules/cjs/loader.js:815:32)
可能是 webpack 的问题,但我不确定。
webpack.config.server.js:
const path = require('path');
const nodeExternals = require('webpack-node-externals');
module.exports = {
entry: './server.js',output: {
filename: 'server.js',path: path.resolve(__dirname,'build')
},resolve: {
modules: [path.resolve(__dirname,'src'),'node_modules'],extensions: ['.js','.jsx','.less']
},target: 'node',node: {
__dirname: false,},externals: [nodeExternals()],module: {
rules: [
{
test: /\.less$/,use: [
{
loader: 'style-loader'
},{
loader: 'css-loader'
},{
loader: 'less-loader',options: {
javascriptEnabled: true
}
}]
},{
test: /\.js$/,exclude: /node_modules/,use: 'babel-loader',{
exclude: [/\.js$/,/\.html$/,/\.json$/],loader: 'file-loader',options: {
name: 'static/media/[name].[hash:8].[ext]',publicPath: '/',emitFile: false,],};
.babelrc:
{
"presets": [
"@babel/preset-react",[
"@babel/preset-env",{
"targets": {
"node": "current"
}
}
]
],"plugins": [
[ "babel-plugin-transform-require-ignore",{
"extensions": [".less",".sass"]
}],"@babel/plugin-proposal-class-properties","babel-plugin-root-import",["import",{ "libraryName": "antd","style": true}]
]
}
解决方法
这是服务器的 webpack 配置,因此您需要在 webpack 中使用 MiniCssExtractPlugin 将 css/less/sass 文件发送到 build/css。然后在服务器端,注入指向 build/css 中的 css/less/sass 文件的脚本。
例如用于纯 css 的 webpack 配置(您需要在您的情况下添加较少的支持)
{
test: /\.(css|less)$/i,use: [
{
loader: MiniCssExtractPlugin.loader
},{
loader: 'css-loader'
},{
loader: 'less-loader',options: {
javascriptEnabled: true
}
}
]
}
让我们假设这个 webpack 会发出这个文件 build/css/main.css
。然后,你的 server.js 看起来像这样:
app.use("*",(req,res) => {
let htmlData = fs.readFileSync("build/index.html","utf8");
const cssData = fs.readFileSync("build/css/main.css","utf8");
htmlData = htmlData.replace("</head>",`<style>${cssData}</style></head>`);
});
如果这还不足以使其正常工作,您将需要为 LESS 配置更多。