【问题标题】:Multi-tenant JavaScript application with tenant specific bundles具有租户特定捆绑包的多租户 JavaScript 应用程序
【发布时间】:2017-11-28 13:02:46
【问题描述】:

我正在研究构建多租户 JS Web 应用程序的方法。我希望能够导入如下文件。

import Thing from './thing'

我想配置 webpack/babel/一个工具 以首先查找特定于租户的文件,即 thing.tenant.js,然后回退到 thing.js

除了租户之外,react-native 中特定于平台的代码的类似方法将作为构建的一部分提供,并最终得到它自己的包 bundle.tenant.js

有谁知道这样做的方法吗?

【问题讨论】:

  • 我认为你需要一个对 import 的包装器。类似于tenantImport("./thing") 并实现您在tenantImport 中提到的逻辑
  • @Adelin,谢谢,这是一个不错的选择。我已经看到了这个的几个实现。我仍在深入研究 react-native 代码,看看他们是如何为 filename.{platform}.js 做的,但这是一个很大的代码库,我没有找到任何东西。
  • @benembery 您是否有幸找到了可行的解决方案?
  • @TimRogers 我们仍在寻找更好的方法,但 Adelin 建议的方法是我们迄今为止使用的方法。

标签: javascript webpack ecmascript-6 babeljs


【解决方案1】:

所以我们终于找到了解决方案。我们在配置文件中返回一组 webpack 配置。

使用 webpack 合并,我们将共享配置与特定于租户的配置相结合。我们制作了一种方法来生成这些以使配置更加简洁。

对于每个租户,我们在解析中自定义扩展数组,使其首先查找具有租户扩展名的文件,如下所示。

  {
    resolve: {
      extensions: [`.${tenant}.js`, ".js"]
    }
  }

这意味着当我们的代码像这样导入一个模块时

import Header from './header'

Webpack 会先查找header.{tenant}.js,然后再请求tenant.js

我们对 sass 导入应用了相同的原则,但是,我们目前是 sass-loader 的分叉版本,以实现与 sass 相同的功能。

module: {
    rules: [
        {
            test: /\.scss$/,

            use: [
                // Loaders omitted for brevity...
                {
                    loader: "sass-loader",
                    options: {
                        sourceMap: true,
                        extensions: [`.${tenant}.scss`, ".scss", ".sass", ".css"],
                    }
                }
            ]
        }
   ]
}

这给了我们所需的 90%。但是构建时间缓慢,因为多个配置意味着多个 webpack 运行。为了缓解这种情况,我们开始使用webpack hard source plugin,这使得构建时间更容易接受。在插件配置中添加了以下配置。

new HardSourceWebpackPlugin({
    configHash: (webpackConfig) => {
            const config = {
                webpackConfig,
                // our custom config merged in here...
            }
            return require('node-object-hash')({
                sort: false
            }).hash(config);
    },
})

【讨论】:

  • 嗨,如果您需要在特定组件上添加一些元素,并且该元素应复制到每个客户端。为每个现有客户同步更改的最佳方式是什么?
  • @VitorCamancho 我不确定我是否完全理解您想要实现的目标。
  • 想象一下,我有两个组件 UserDeitails.tsx 和 UserDetails.tenant1.tsx ,它们显示了用户的详细信息列表。由于我只想在tenant1 上特别添加一个细节,我需要完全复制默认组件的内容并粘贴到tenant1 上并添加额外的细节,还是有另一种方法?问题是,我们如何保持与默认组件的代码同步,因为我应该对默认组件进行所有一般性更改并由租户继承。
  • 恐怕我还没有找到简单的方法。但是,有时可以将定制分解为更小的组件或将它们作为道具。我希望这会有所帮助
猜你喜欢
  • 2014-02-10
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
  • 2013-06-05
  • 2015-03-06
  • 2013-12-23
  • 1970-01-01
相关资源
最近更新 更多