antd的babel-plugin-import插件,服务端渲染时,如果babel中配置了import会报错,删掉正常启动

发布于 2022-09-11 18:56:34 字数 2652 浏览 13 评论 0

使用express服务端渲染,如果babel中配置了import会报错,删掉就可以正常启动。
但是这个配置,用webpack,不管是devServer,还是编译文件,都正常。只有在尝试用express启动的时候会包错

就是在.babelrc文件中的plugins的这段代码:

[
    "import",
    {
        "libraryName": "antd",
        "libraryDirectory": "es",
        "style": true
    }
]
(function (exports, require, module, __filename, __dirname) { import '../../style/index.less';
                                                                     ^^^^^^^^^^^^^^^^^^^^^^^^

SyntaxError: Unexpected string
    at new Script (vm.js:79:7)
    at createScript (vm.js:251:10)
    at Object.runInThisContext (vm.js:303:10)
    at Module._compile (internal/modules/cjs/loader.js:657:28)
...

我的相关配置文件:
.babel

{
    "presets": ["@babel/preset-env", "@babel/preset-react"],
    "plugins": [
        "@babel/plugin-proposal-object-rest-spread",
        "@babel/plugin-transform-runtime",
        [
            "import",
            {
                "libraryName": "antd",
                "libraryDirectory": "es",
                "style": true
            }
        ]
    ]
}

server.js

require('ignore-styles');
var fs = require('fs');
var babelConfig = JSON.parse(fs.readFileSync('./.babelrc'));
require('@babel/register')(babelConfig);

require('./express.js');

express.js

import path from 'path';
import fs from 'fs';
import express from 'express';
import React from 'react';
import {renderToString} from 'react-dom/server';
import {StaticRouter} from 'react-router-dom';
import Home from './src/component/Home';
const ROOT_PATH = path.resolve(__dirname);
const BUILD_PATH = path.resolve(ROOT_PATH, 'build');
const app = express();

app.use(express.static(BUILD_PATH));
app.use('*', function (req, res) {
    let context = {};
    const template = renderToString(
        <StaticRouter location={req.url} context={context}>
            <Home/>
        </StaticRouter>
    );
    if(context.status === 404) {
        res.status(404);
    }
    fs.readFile(path.resolve(BUILD_PATH + '/index.html'), 'utf8', (err, data) => {
        if (err) {
            console.error(err);
            return res.status(500).send('An error occurred');
        }
        return res.send(
            data.replace('<div id="root"></div>', `<div id="root">${template}</div>`)
        )
    });
});

const server = app.listen(3000, () => {
    const host = server.address().address;
    const port = server.address().port;
    console.log('server is start at', host, port);
});

启动 node ./server.js

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

十年九夏 2022-09-18 18:56:34

我是直接在webpack.config里配的。

{
                    test: /\.(js|jsx)$/,
                    exclude: /node_modules/,
                    use: [
                        {
                            loader: 'babel-loader',
                            options: {
                                babelrc: true,
                                cacheDirectory: true,
                                plugins: [["import", {
                                    "libraryName": "antd-mobile",
                                    "libraryDirectory": "es",
                                    "style": "css",
                                }]],

                            }
                        },
                        {
                            loader: 'eslint-loader',
                            options: {
                                eslintrc: true
                            }
                        },
                    ],
                }
还给你自由 2022-09-18 18:56:34

删除.babelrc文件,新建babel.config.js文件在根目录
babel.config.js

function isBabelRegister(caller) {
    return !!(caller && caller.name === "@babel/register");
}

module.exports = function (api) {
    const presets = ["@babel/preset-env", "@babel/preset-react"];
    const plugins = [
        "@babel/plugin-proposal-object-rest-spread",
        "@babel/plugin-transform-runtime"
    ];

    if(!api.caller(isBabelRegister)) {
        plugins.push(
            [
                "import",
                {
                    "libraryName": "antd",
                    "libraryDirectory": "es",
                    "style": true
                }
            ]
        );
    }

    api.cache(true);

    return {
        presets,
        plugins
    };
};

服务端入口文件:

require('ignore-styles');
require('@babel/register')();
require('./express.js');

主要依靠babel.config.js中的isBabelRegister方法判断是否是服务端渲染

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文