服务端响应 webpack 2 System.import

IT技术 reactjs webpack isomorphic-javascript
2021-05-17 17:47:17

我有一个使用 webpack 2 编译资产的同构应用程序。我现在添加了分块,System.import它在 webpack 端有效,但在没有找到函数的服务器端无效。

知道我该如何解决这个问题吗?

2个回答

有几个选项可用于System.import使用同构/服务器端渲染:

特征检测System和 polyfill

Node 允许您require()在多个地方调用,并且System.import按以下方式填充应该可以工作:

if (typeof System === "undefined") {
  var System = {
    import: function(path) {
      return Promise.resolve(require(path));
    }
  };
}

如果您正在寻找更健壮的实现,还有es6-micro-loader,它实现了一个System在浏览器和节点中都可以使用的polyfill

使用babel-plugin-system-import-transformer替换System.import为等效的 UMD 模式

即采用以下形式:

System.import('./utils/serializer').then(function(module){
    console.log(module);
});

并将其转换为:

new Promise(function (resolve, reject) {
    var global = window;

    if (typeof global.define === 'function' && global.define.amd) {
        global.require(['utilsSerializer'], resolve, reject);
    } else if (typeof module !== 'undefined' && (module.exports && typeof require !== 'undefined') ||
               typeof module !== 'undefined' && (module.component && (global.require && global.require.loader === 'component'))) {
        resolve(require('./utils/serializer'));
    } else {
        resolve(global['utilsSerializer']);
    }
}).then(function(module){
    console.log(module);
});

或者

使用面向 Node 的 Webpack 构建(将使用 require 加载块):

webpack --target node

这些选项之一可能适合您的需求:

  1. 使用带有目标“节点”的Webpack 编译您​​的代码并运行包服务器端。
  2. 如果您已经在与巴别使用编译通天注册或类似的,你可以尝试像巴别塔-插件-删除-的WebPack(可能需要一个PR将它与获得工作System.importrequire.ensure)。
  3. 定义一个全局模拟,System.import它只使用 require() module返回一个已解决的Promise。