Я нашел некоторые ответы запутанными, поэтому вот точные шаги, которые вы должны выполнить, чтобы это сработало для вас:
В моем случае я делаю это так:
index.php
<script src="/js/crm/lib/require.js"></script>
<script>
// this is so called "named define"
define('dto', {
page: JSON.parse('{{ pageDTO | json_encode }}'),
flashMessages: JSON.parse('{{ this.flashSession.getMessages() | json_encode }}')
});
// note we are using relative path to public dir here
// order is also important, we need to define our dto module before bootstraping the application
require(['/js/crm/app.js']);
</script>
app.js
"use strict";
require.config({
// ...
baseUrl: '/js/crm/lib',
paths: { app: '../app' }
});
require(['app/bootstrap']);
некоторые-module.js
(в данном случае layout.js, который требуется в app / bootstrap)
"use strict";
define([
'dto',
'jquery',
'lodash'
], function (dto, $, _) {
console.log(dto);
});
Примечание с использованием data-main
для начальной загрузки приложения, без явного вызова require может работать, но из-за состояния гонки. Если определение dto по какой-либо причине потребует больше, чем требует requirejs для вызова сценария основного модуля, произойдет сбой. Мы не хотим на это полагаться, поэтому все делаем сами:)
Так что это не сработает (иногда):
<script data-main="/js/crm/app.js" src="/js/crm/lib/require.js"></script>
<script>
// this is so called "named define"
define('dto', {
page: JSON.parse('{{ pageDTO | json_encode }}'),
flashMessages: JSON.parse('{{ this.flashSession.getMessages() | json_encode }}')
});
</script>