TypeScript динамический импорт - PullRequest
0 голосов
/ 09 июня 2018

Я хотел бы спросить, возможно ли использовать пользовательское Promise для загрузки модуля вместо немедленного разрешения обещания, используемого машинописью.

Если у меня есть

function test() {
   const m: any = import("./test");
   console.log(m);
}

tsc, переносится внемедленно (почти;)) разрешить Promise, который вызывает require, что-то вроде:

function test() {
   m = Promise.resolve().then(() => require("..."));
   console.log(m);
}

, что на самом деле хорошо работает, когда модуль (или лучше упомянутый пакет модулей) загружается из тега HTML-сценария, но я хочуиспользуйте пользовательский ленивый загрузчик, возвращающий обещание и разрешающий его, когда модуль (пакет) будет загружен пользовательским загрузчиком позднее в жизненном цикле приложения (в основном, когда это потребуется, а не при загрузке html), затем используйте команду require для предоставления конкретного модуля иззагруженный модуль.

Это достижимо с помощью TS или мне нужно использовать другой подход (то есть пользовательскую функцию импорта)?Я бы предпочел путь TS.

target: "esnext", модуль: "commonjs"

EDIT (ОТВЕТ):

прежде всего,мое мышление было плохим.

function timer(): Promise<void> {
   return new Promise<void>((resolve: () => void) => {
      setTimeout(resolve, 3000);
   });
}

let p = Promise.resolve().then(async() => { await timer(); } )

разрешается после завершения обратного вызова .then.Не раньше этого.Таким образом, это не сразу разрешает обещание, и в ранее упомянутом случае оно разрешается, когда функция require возвращается.Я этого не знал, поэтому немного растерялся.

Из-за этого невозможно использовать динамический импорт без какого-либо компоновщика или посткомпилятора, такого как babel или webpack, когда для модуля TSC установлено значение"CommonJS".Когда используется babel или webpack, динамический импорт может быть заменен другим загрузчиком / распознавателем, чем требуется для асинхронной загрузки сценария, выполнения и разрешения модуля из него.Я не тестировал в узле, он мог работать из коробки без необходимости дополнительных инструментов сборки.

С модулем TSC "esnext" ключевое слово импорта сохраняется в коде TSC и может использоваться напрямуюв среде, где это поддерживается.

...