Подтвердить что ты не робот

Требовать JS файлы динамически во время выполнения с помощью webpack

Я пытаюсь перенести библиотеку из grunt/requirejs в webpack и наткнулся на проблему, которая может быть игровым автоматом для этого начинания.

В библиотеке, в которой я пытаюсь установить порт, есть функция, которая загружает и оценивает несколько модулей - на основе их имен файлов, которые мы получаем из файла конфигурации, - в наше приложение. Код выглядит так (кофе):

loadModules = (arrayOfFilePaths) ->
  new Promise (resolve) ->
    require arrayOfFilePaths, (ms...) ->
      for module in ms
        module ModuleAPI
      resolve()

require здесь нужно вызвать во время выполнения и вести себя так же, как с requireJS. Кажется, что Webpack заботится только о том, что происходит в "процессе сборки".

Это что-то, что веб-пакет принципиально не заботит? Если да, могу ли я использовать requireJS с ним? Что такое хорошее решение для динамического загрузки активов во время выполнения?

edit: loadModule может загружать модули, которых нет на время сборки этой библиотеки. Они будут предоставлены приложением, которое реализует мою библиотеку.

4b9b3361

Ответ 1

Итак, я обнаружил, что мое требование о том, что некоторые файлы, загруженные во время выполнения, которые доступны только в режиме "время компиляции", а не на "время компиляции библиотеки", невозможно с помощью webpack.

Я изменю механизм, чтобы моя библиотека больше не нуждалась в файлах, но нужно передать необходимые модули. В некотором смысле, это все равно будет лучшим API.

изменить, чтобы уточнить:

В основном, вместо:

# in my library
load = (path_to_file) ->
  (require path_to_file).do_something()

# in my app (using the 'compiled' libary)
cool_library.load("file_that_exists_in_my_app")

Я делаю это:

# in my library
load = (module) ->
  module.do_something()

# in my app (using the 'compiled' libary)
module = require("file_that_exists_in_my_app")
cool_library.load(module)

Первый код работал в require.js, но не в webpack.

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

Ответ 2

Существует концепция с именем context (http://webpack.github.io/docs/context.html), она позволяет делать динамические потребности.

Также есть возможность определить точки разделения кода: http://webpack.github.io/docs/code-splitting.html

function loadInContext(filename) { 
    return new Promise(function(resolve){
        require(['./'+filename], resolve);
    })
}

function loadModules(namesInContext){
    return Promise.all(namesInContext.map(loadInContext));
}

И используйте его, как показано ниже:

loadModules(arrayOfFiles).then(function(){
    modules.forEach(function(module){
        module(moduleAPI);
    })
});

Но, скорее всего, это не то, что вам нужно - у вас будет много кусков вместо одного пакета со всеми необходимыми модулями, и, вероятно, он не будет оптимальным.

Лучше определить модуль, требуемый в вашем файле конфигурации, и включить его в свою сборку:

// modulesConfig.js
module.exports = [
   require(...),
   ....
]

// run.js
require('modulesConfig').forEach(function(module){
    module(moduleAPI);
})