Я пытаюсь преобразовать перегруженную JavaScript страницу для использования TypeScript с RequireJS для управления зависимостями модуля.

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

Неужели очень опасно помещать сценарии не AMD в обычные теги <SCRIPT> над тегом Require и просто предполагать, что они загружены?

Если это плохая идея, как лучше справиться с этим? Нужно ли иметь AMD и не AMD версию каждого скрипта? Или мне нужно преобразовать все сценарии, чтобы они при необходимости вызывали define()?

17
Jonathan Sayce 29 Янв 2013 в 20:39

2 ответа

Лучший ответ

Последние версии RequireJS позволяют вам притворяться , что обычные файлы JS на самом деле являются модулями AMD, которые просто ничего не возвращают.

Самая последняя версия, которую я пробовал - 2.1.4 - на самом деле позволяет обрабатывать простые файлы JS как модули. Пример:

require(
    [
        'path/to/module' // <- AMD module
        ,'path/to/plainjs' // <- actually a plain JS file
    ]
    , function(module, plain){
        // module will be per define in that file.
        // plain will be 'undefined' type
    }
)

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

require(['js/underscore'], function(){

    // nesting to insure Underscore, a prereq to BackBone
    // completes loading before backbone starts
    require(
        [
            'path/to/module' // <- AMD module
            ,'js/backbone' // <- actually a plain JS file
        ]
        , function(module){
            // module will be per define in that file.

            window.BackBone // is available for you

        }
    )

})

Обратите внимание: хотя RequireJS раньше требовал, чтобы вы добавляли «.js» в конец простых файлов JS, чтобы указать, что они являются простыми JS, в приведенных выше примерах вы НЕ используете «.js». Эта ссылка на модуль без расширения позволяет идентификатор модуля, который следует за псевдонимами paths и maps, а идентификаторы с .js обрабатываются как литералы и никогда не переводятся.

17
ddotsenko 30 Янв 2013 в 11:56

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

Вы можете сослаться на определите require.d.ts из «Определенно типизированного» и сделайте прямые вызовы в функцию require, а не в выражение import, что может сделать ваши вещи более согласованными.

1
Fenton 29 Янв 2013 в 17:04