在运行时动态加载包

时间:2018-11-01 02:04:24

标签: javascript node.js typescript webpack ecmascript-6

在一个打包了webpack的项目中考虑一个捆绑包,所有捆绑到bundle1.js的地方:

// entry.ts
import * as _ from 'lodash';
// other imported libraries
import { something } from './util';
// other imported bundle project local code

export function doBundleSomething(args: any): any {
  // actually does something necessary
  console.log('doing things');
  return 'whatever result';
}

Shell程序是另一个项目,其中也包含webpack和main.js之外的所有bundle1.js依赖项,因为它是在运行时由环境决定的:

// main.ts
import * as _ from 'lodash';
// other imported libraries
import { something } from './shell-util';
// other imported shell program local code

// do something useful
const ifBundleNeeded = true; // decided by useful something

if (ifBundleNeeded) {
  const bundlePath = process.env.BUNDLE_PATH; // could be CLI argument
  // somehow load bundle 
  const doBundleSomething = ???

  const result = doBundleSomething({arg: 'hello-bundle'});
  console.log('bundle said', result);
}

应按以下方式执行:

BUNDLE_PATH=/opt/path/some-bundle.js node /srv/program/path/main.js

注意:

  • 所有应用都使用了最低限度的最低配置
  • 两个捆绑包的
  • tsconfig目标是es6
  • typescript> = 3.x和webpack awesome-typescript-loader(即最新和最好的)
  • 两个捆绑中的代码重复是不可避免的并且可以接受的
  • 无需担心安全问题(例如代码注入等)

如何使用最少的最低配置实现此行为?

如果在外壳程序Webpacking中BUNDLE_PATH是已知的(即,硬编码路径,以便webpack可以看到它),则它与requireimport()(包括{{ 1}}。

否则,使用不同的替代方案会在不同阶段失败,并且在使用时会出现从eval("require")()Cannot find module的各种错误。

0 个答案:

没有答案