【问题标题】:Is it possible to disinguish between server and client in babelrc config (meteor)?是否可以在 babelrc 配置(流星)中区分服务器和客户端?
【发布时间】:2022-01-21 09:17:02
【问题描述】:

我正在使用流星,并且想要一个仅用于激活服务器端代码的 babel 插件。是否可以通过 babelrc 配置或直接在 babel 插件中完成?类似的东西

if(isServer) { //Do your thing only for server sided code}

--编辑:

为了更好的描述,我有以下例子:

import HelloWorld from "/imports/components/HelloWorld";

export const ROUTES = [
    {
        label: "Test",
        path: "/TEST",
        role: ["test.view"],
        component: HelloWorld, //Render für Route
    },
]

现在我想在双方(服务器和客户端)上使用此代码。在服务器端我不能使用这个导入,因为它会导致一些错误。对我来说,最好简单地过滤路由中的导入线和组件线。因此,我想在 babel 插件中区分服务器和客户端。

【问题讨论】:

  • 我假设你已经知道Meteor.isServer。你能详细说明为什么你特别需要 babel 来处理这个问题吗?
  • Meteor.isServer 在 babel 插件中不可用。我想用代码块过滤一些导入,我只需要在客户端,而不是在服务器端。因此我需要在我的 babel 插件或配置中进行这种区分。
  • 通过正确的导入结构,在大多数情况下应该很容易区分仅客户端代码和仅服务器代码。在更难的情况下,将仅客户端代码与服务器应用程序捆绑在一起并没有什么坏处,前提是您使用Meteor.isClient 保护它。相反(防止仅服务器代码被发送到客户端),您可以使用动态导入并将导入放在server 文件夹中。那么所有的case都覆盖了,不用折腾Babel了。
  • 根据您的描述,动态导入绝对是可行的方法,甚至还有客户端延迟加载的额外好处,前提是您的服务器代码不需要访问component 键。跨度>
  • @ghybs 你是对的。感谢您的意见,用动态导入重建我的用例。

标签: reactjs meteor babeljs


【解决方案1】:

在 babelrc 中这不是直接可能的,但可以在 babel 插件中进行定位。

Babel 7 中的 Option Caller 是我一直在寻找的。​​p>

来自https://stackoverflow.com/a/52315868/8188913的小代码示例

let caller;
module.exports = function(Babel) {
    Babel.caller(function(c) {
            caller = { ...c };
    });
    return {
        visitor: {
            BlockStatement(){
                console.log(caller); // logs e.g. {name: "meteor", arch: "web.browser.legacy"}
            }
        }
    };
};

使用来自 babel 插件 babel-plugin-transform-strip-block 的源代码,我能够为我的用例构建一个完整的解决方案。

无论如何,这不是解决此用例的最佳方法。所以在 ghybs 的一些输入之后(参见comment),动态导入是最好的方法。

【讨论】:

  • 如果您的问题已被其他帖子解决,您应该将其作为上一个帖子的副本关闭
  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
猜你喜欢
  • 1970-01-01
  • 2015-12-10
  • 1970-01-01
  • 2014-09-13
  • 2012-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多