Bowen
@Bowen
Японский бог

Возможно ли вынести Promise & require.ensure в отдельную функцию и подключать файлы через нее?

Привет други.

Ленивая загрузка модулей в angular2 в связке с webpack выглядит примерно так:
loadChildren: () => new Promise(resolve => {
        (require as any).ensure([], (require: any) => {
            resolve(require("./module_path")["ModuleName"]);
        }, "chunkName")
})

Эта конструкция громоздкая и по этому я хочу вынести все это добро в отдельную функцию а модули загружать через нее.

Пример:
function loadModule(path: string){
    // обработка строки path
    let p = new Promise(resolve => {
        (require as any).ensure([], (require: any) => {
            resolve(require(path)[ModuleName]);
        }, chunkName)
    });
    return p;
}
loadChildren: () => loadModule('./module_path#ModuleName')

Проблема в том, что при компиляции, я получаю одно уведомление и одну ошибку:
Уведомление:
Critical dependency: require function is used in a way in which dependencies cannot be statically extracted

Ошибка:
var p = new Promise(function (resolve) {
        !(function webpackMissingModule() { var e = new Error("Cannot find module \".\""); e.code = 'MODULE_NOT_FOUND'; throw e; }()).ensure([], function (require) {
            resolve(require(path)[moduleName]);
        }, chunkName);
    });

Конечно я гуглил, много что нашел и испробовал, но ничего не помогло.
Хотелось бы понять, в чем проблема, что я делаю не так, как это все решить ?
Буду признателен за помощь/советы!
  • Вопрос задан
  • 323 просмотра
Пригласить эксперта
Ответы на вопрос 1
@vybornova
Если еще актуально, то второй пример не работает из-за того что path передается через параметр, а не передан явной строкой в require. Покажу на своем примере, вот так все работает:

export const loadFoo = () => new Promise<any>((resolve, reject) => {
    require.ensure(["Foo/path"], require => {
        resolve(require("Foo/path"));
    }, error => reject(error));
});


А вот так нет:
export const load = (path: string) => new Promise<any>((resolve, reject) => {
    require.ensure([path], require => {
        resolve(require(path));
    }, error => reject(error));
});
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы