Можно ли смешивать модули AMD и CommonJS в одном проекте Typescript?

Я пытаюсь интегрировать Durandal с сервером node.js, используя Typescript для определения модулей как на стороне сервера, так и на стороне клиента.

Проблема, с которой я столкнулся, заключается в том, что Durandal сильно зависит от стиля RequireJS и AMD для определения модулей, которые я не хотел бы вводить на стороне сервера, и, поскольку он использует RequireJS, у меня нет возможности запускать модули CommonJS. на клиенте (по умолчанию для node.js).

Последний гвоздь в гроб — это то, что я не нашел способа определить, какие файлы должны быть скомпилированы как модули AMD, а какие — как CommonJS с помощью tsc — это кажется самым простым решением.

Я не думаю, что разделение клиентской части и серверной части является вариантом, так как много кода будет общим для обеих частей.

Итак, мой вопрос состоит из трех частей:

  • есть ли способ смешивать модули AMD и CommonJS в одном проекте Typescript (желательно с использованием NodejsTools)

  • если нет, есть ли способ заставить Durandal работать с файлами CommonJS для загрузки представлений/моделей представления и т. д.

  • если ничего из этого невозможно, возможно ли (и разумно) использовать модули AMD на сервере node.js

Любые идеи высоко ценятся


person Slawek    schedule 13.03.2014    source источник


Ответы (4)


есть ли способ смешивать модули AMD и CommonJS в одном проекте Typescript (желательно с использованием NodejsTools)

да. Используйте 1_. См. https://github.com/basarat/demo-fullstack/tree/master/src. в частности, общие файлы gruntfile: https://github.com/basarat/demo-fullstack/blob/master/src/Gruntfile.js#L4-L6 commonjs: https://github.com/basarat/demo-fullstack/blob/master/src/Gruntfile.js#L26 и: https://github.com/basarat/demo-fullstack/blob/master/src/Gruntfile.js#L37

person basarat    schedule 13.03.2014
comment
Примечание. Я только что обновил эту демонстрацию, чтобы сделать ее еще более потрясающей. - person basarat; 16.03.2014

Это скорее длинный комментарий, чем ответ

Я рассматривал ту же проблему и пробовал grunt-ts, gulp-ts, наблюдатели за файлами Webstorm, сценарии командной строки, все, кроме Visual Studio, поскольку я боюсь полагаться на IDE для процесса сборки (Webstorm наблюдатели являются исключением, так как они такие же, как grunt или любой другой наблюдатель, их легко воспроизвести, и их просто удобно пробовать конфигурации); В настоящее время я использую внутренние модули, но компилирую только «экспортные» модули с файловыми фильтрами (на основе расширений, это чище) и tsc загружает цепочку, когда на них ссылаются;

У меня есть разные цели вывода в зависимости от того, чего я пытаюсь достичь, например, в узле, браузере, угловом, тестировании, мокко, жасмин и т. д.

как в:

/MyModule
myModule.ts
myModule.d.ts
myModule.mdl.ts (exports amd)
myModule.export.ts (exports commonjs)
myModule.test.ts (exports mocha test, no KARMA!)
etc... 

не полагаясь на способность Ts «экспортировать модуль»

Это работает, но ... Но я не на 100% доволен многими файлами .... это пахнет ... слишком много целей Gruntfile трудно читать (слишком большой), мне нужно помнить или документировать, как это работает, пока У меня есть время, чтобы полностью автоматизировать его (если это разумно возможно)

Я думаю, что приведенные ниже варианты имеют больше смысла для DRY и KISS, но я также не на 100% уверен в необходимом шаблоне.

Модули Typescript должны быть шаблонными, чтобы при компиляции модуль мог иметь «форму», которую я хочу, не полагаясь на дополнительные шаги сборки.

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

UMD (определение универсального модуля)

Обозреватель

амдефайн

RequireJ в Node

Загрузка модулей Requirejs из обычных пакетов

person Dan    schedule 15.10.2014

Должна быть возможность смешивать требуемые файлы AMD и обычные js. Ваша html-страница будет включать в себя скрипты, подобные следующим:

<script src="/tscode_common/common_js_file.js"></script>
<script data-main="/tscode_amd/tscode_amd_config.js" type="text/javascript" src="lib/require.js"></script>

Но конкретный проект TypeScript может быть только AMD или обычным js, так как параметры компилятора индивидуальны для каждого проекта.
Решением этой проблемы может быть вложение подпроектов TypeScript (.prj) в подкаталоги вашего основного веб-приложения. что-то вроде следующего:

+- / (base directory for web application )
+- /main_app.prj ( main web app project file )
+- index.html
+- /tscode_common/ ( put all common js files here )
+- /tscode_common/common_js.prj ( project file with commonjs options)
+- /tscode_common/common_js_file.ts (common ts files )
+- /tscode_amd/ ( put all amd files here )
+- /tscode_amd/amd_js.prj ( project file with amd options )
+- /tscode_amd/tscode_amd_config.ts ( require config file )
+- /tscode_amd/amd_js_file.ts ( amd ts files )
person blorkfish    schedule 13.03.2014

Просто создайте 2 копии файла *.njsproj. Одна копия для сервера и одна для клиентского кода. В клиентском проекте оставить только public и view (исключить все, что связано с сервером). Оставьте в серверном проекте только то, что относится к серверу. Убедитесь, что в клиентском проекте установлен AMD, а в серверном — CommonJs. Наслаждаться!

person Trident D'Gao    schedule 14.10.2014