Может ли оптимизатор requirejs работать с относительными путями?

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

Я не могу заставить оптимизатор requirejs правильно работать с относительными путями.

мое веб-приложение имеет следующие каталоги

  • приложение
    • index.html - включает requirejs, main.js, затем require(['plugins']) (стандартная многостраничная настройка)
    • скрипты
      • main.js - начальная загрузка requirejs, устанавливает baseUrl в / scripts
      • plugins.js - ссылается и выставляет модули из app-plugins. Ссылки через ../app-plugins/a.js
    • приложение-плагинов
      • a.js

в неоптимизированной версии все работает нормально (запустите веб-сервер в приложении, откройте консоль и перейдите на страницу индекса).

Оптимизация, однако, дает мне ошибку из-за ../ в plugins.js. Чтобы увидеть этот компакт-диск в каталог оптимизации и запустить node .\node_modules\requirejs\bin\r.js -o .\build.json, Ошибка будет

W:\temp\requireop\optimization [master]> .\Build-RequireJs.ps1

Tracing dependencies for: main

Tracing dependencies for: plugins
Error: ENOENT, no such file or directory 'W:\temp\requireop\build\app-plugins\a.js'
In module tree:
    plugins

Error: Error: ENOENT, no such file or directory 'W:\temp\requireop\build\app-plugins\a.js'
In module tree:
    plugins

    at Object.fs.openSync (fs.js:427:18)

1 ответ

Решение

Я сделал следующие изменения, и это сработало:

  • main.js:

    baseUrl: 'scripts'
    

    В общем случае пути чувствительны к регистру; Также лучше не включать ведущий слеш.

  • optimization/build.json будет выглядеть так:

    {
        appDir: '../app',
        baseUrl: 'scripts',
        dir: '../build',
        modules: [ // the same
        ]
    }
    

    Вы можете найти детали здесь, но некоторые объяснения:

    1. appDir позволяет r.js знать, где находятся источники. Я верю, что это также дает r.js знать, как обращаться с относительными путями - хотя и не совсем уверен.
    2. затем baseUrl становится относительно appDir,
    3. И dir где вывод идет, он также будет копировать файлы, найденные в вашем appDir там.

Этот процесс перезаписывает файлы в /build/,

Другие вопросы по тегам