Рассмотрим пакет в каком-то проекте, упакованном с веб-пакетом, и все зависимости от 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
при использовании.