Динамическая загрузка пакета во время выполнения - PullRequest
0 голосов
/ 01 ноября 2018

Рассмотрим пакет в каком-то проекте, упакованном с веб-пакетом, и все зависимости от 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 - это еще один проект, также упакованный с веб-пакетом и всеми зависимостями от 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 с веб-пакетом awesome-typescript-loader (т. Е. Последний и самый большой)
  • дублирование кода в обоих пакетах неизбежно и приемлемо
  • Проблемы безопасности не имеют значения (например, внедрение кода и т. Д.)

Как добиться этого поведения с минимальными настройками?

Если известен BUNDLE_PATH (т. Е. Путь жесткого кодирования, так что веб-пакет его видит) при веб-упаковке программы оболочки, он работает в разных вариациях с require, import(), включая eval("require")().

В противном случае использование разных альтернатив заканчивается неудачей на разных этапах с различными ошибками от Cannot find module до undefined при использовании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...