Помощью RequireJS пути конфигурации

моя конфигурация разработки (в " index.html " файл) для RequireJS:

<script src="require-2.1.5.min.js"></script>
<script>
    require.config({
        baseUrl: 'js',
        paths: {
            angular: 'libraries/angular-1.1.5.min',
            jquery: 'libraries/jquery-2.0.0.min',
            underscore: 'libraries/underscore-1.4.4.min',
            ...
            zeroclipboard: 'plugins/zeroclipboard-1.0.7.min',
            tablesorter: 'plugins/jquery.tablesorter-2.9.1.min',
            ...
        },
        shim: {
            'angular': {
                exports: 'angular'
            },
            'underscore': {
                exports: '_'
            }
        },
        packages: [
            {
                name: 'index',
                location: 'app/index',
                main: 'main'
            }
        ]
    });

    require(['index']);
</script>

но на производстве у меня есть только 2 Объединенных файла для библиотек и плагинов:

js/libraries.js // all jQuery, AngularJS, RequireJS, Underscore and other libraries concatenated
js/plugins.js // all plugins (already an AMD modules, no need for "shim" config) concatenated

Итак, как я могу написать свою конфигурацию "пути" сейчас? У меня нет библиотеки/угловой-1.1.5.минута.js' и другие пути.

мое решение-написать:

    paths: {
        angular: 'libraries',
        underscore: 'libraries'
    }

я связываю AngularJS и подчеркиваю до '.js' файл и все отлично работает. (Нет необходимости в jQuery и всех плагинах - они уже являются модулями AMD).

но это правильный способ записи путей? Мое решение кажется мне своего рода грязным обходным путем, а не лучшим решением.

мой р. процесс сборки js:

({
baseUrl: 'scripts',
paths: {
    jquery: 'jquery-2.0.0.min',
    ...
    tablesorter: 'jquery.tablesorter-2.0.5.min',
    zeroclipboard: 'zeroclipboard-1.0.7.min'
},
name: 'foo/main',
exclude: [
    'angular',
    'jquery',
    ...
    'tablesorter',
    'zeroclipboard'
],
optimize: 'uglify',
out: 'production/js/foo.js'
})

UPD 1:

что хочется:

www.mysite.com/about.html:

<script src="js/libraries.js"></script><-- jQuery (already AMD), AngularJS (not AMD), RequireJS, Underscore (not AMD) and other libraries already here, only 1 http request needed //-->
<script src="js/plugins.js"></script><-- all AMD //-->
<script>
    require.config({
        baseUrl: 'js',
        paths: {
            angular: WHAT I NEED TO WRITE HERE?,
            underscore: WHAT I NEED TO WRITE HERE?
        },
        shim: {
            'angular': {
                exports: 'angular'
            },
            'underscore': {
                exports: '_'
            }
        },
        packages: [
            {
                name: 'about',
                location: 'js',
                main: 'about'
            }
        ]
    });

    require(['about']); // will load "js/about.js"
</script>

UPD 2:

Хорошо, ясно о "приоритете", поэтому мне не нужен первый и второй " сценарий" теги (но мне нужно отделить " Require.js "from" библиотеки.js") - RequireJS загрузит их автоматически. Но что нужно делать с библиотеками без AMD в "библиотеках".файл js?

AngularJS и UnderscoreJS не являются модулями AMD, поэтому я должен использовать "прокладку", верно? Но чтобы " прокладка "работала, мне также нужно использовать" пути", поэтому" прокладка " может найти модули с шиммой, верно? Но у меня все еще есть только 1 файл - "библиотеки".js", и я не могу написать его в опции "путь" ... просто действительно застрял...

2 ответов


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

require.config({
    priority: ["libraries", "plugins"]
});

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

({
    baseUrl: 'scripts',
    paths: {
        jquery: 'jquery-2.0.0.min',
        ...
        tablesorter: 'jquery.tablesorter-2.0.5.min',
        zeroclipboard: 'zeroclipboard-1.0.7.min'
    },
    modules: [
        {
            name: 'foo/main'
            excludes: ...
        },
        {
            name: 'libraries'
        },
        {
            name: 'plugins'
        }
    ],
    optimize: 'uglify',
    out: 'production/js/foo.js'
})

вы должны использовать одинаковые настройки для обеих сред. И эта конфигурация, которая у вас есть, должна быть во внешнем файле. Когда вы оптимизируете его с помощью r.j, Все модули уже в этом одном файле, поэтому RequireJS будет просто использовать их без загрузки. Похоже, вам нужно настроить процесс сборки.

проверка моего последнего блоге об этом.