Laravel mix.js внутри цикла ничего не выводит - PullRequest
0 голосов
/ 12 сентября 2018

Я работаю над проектом Laravel / VueJs и пытаюсь скомпилировать мои js-файлы с помощью Laravel mix API.

До сих пор это работало отлично, я просто связывал свои активы, как это:

mix.js('path/to/asset/index.js', 'public/js/apps/my_asset.js')
    .js('path/to/asset_2/index.js', 'public/js/apps/my_asset_2.js')
    .js('path/to/asset_3/index.js', 'public/js/apps/my_asset_3.js')
    ...

Но это решение не удовлетворяет, так как я получаю все больше и больше файлов для добавления в список. Поэтому я решил автоматизировать этот процесс.

Что я хочу сделать, так это прочитать содержимое каталога и найти все файлы .js, которые я хочу скомпилировать. Затем я перебираю этот массив и запускаю mix.js() для каждого файла. Мой код выглядит так:

const readdir = require('readdir-enhanced');    
readdir('resources/assets/js/modules/', {deep: 2}, (err, files) => {
    files.map(file => {
        if (file.match(/index\.js$/)) {
            const moduleName = file.replace('/index.js', '');
            mix.js(`resources/assets/js/modules/${file}`, `public/js/${env}/apps/${moduleName}_app.js`)
        }
    });
});

Проблема в том, что mix.js() не работает, выходной файл не создан.

Когда я console.log() внутри цикла, это работает, так что я уверен, что захожу внутрь цикла. Я также проверил значения переменных file, env и moduleName, и они верны (поэтому проблема не исходит из моих путей).

Я думаю, mix.js() не может работать внутри цикла, кто-нибудь уже сталкивался с этой проблемой? И вы нашли решение?

Заранее спасибо :)

1 Ответ

0 голосов
/ 12 сентября 2018

Действительно, это была проблема с асинхронным обратным вызовом, я не читал внимательно документацию по readdir-extended.Чтобы решить проблему, я просто использовал синхронную функцию для чтения каталога:

let files = readdir.readdirSync('resources/assets/js/modules/', {deep: 2});
files.map(file => {
    if (file.match(/index\.js$/)) {
        const moduleName = file.replace('/index.js', '');
        mix.js(`resources/assets/js/modules/${file}`, `public/js/${env}/apps/${moduleName}_app.js`);
    }
});

Спасибо, tkaus!для направления меня в правильном направлении:)

...