Я хотел бы спросить, возможно ли использовать пользовательское 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 и может использоваться напрямуюв среде, где это поддерживается.