服务器端与 webpack 2 反应 System.import

Server-side react with webpack 2 System.import

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

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

以下选项之一可能适合您的需要:

  1. 使用带有 target 'node' 和 运行 捆绑服务器端的 Webpack 编译您​​的代码。
  2. 如果你已经在使用 babel-register 或类似的工具编译 babel,你可以尝试像 babel-plugin-remove-webpack 这样的东西(除了 require.ensure).
  3. System.import 定义一个全局模拟,它只是 returns 使用 require() 模块的已解决承诺。

有几个选项可用于 System.import 使用 isomorphic/server-side 渲染:

特征检测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-transformerSystem.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);
});

Build with Webpack targeting Node(将使用 require 加载块):

webpack --target node