Возможно ли комбинировать модули AMD и CommonJS в рамках одного проекта Typescript

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

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

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

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

Итак, мой вопрос трижды:

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

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

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

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

Ответ 1

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

Да. Используйте grunt-ts. См. https://github.com/basarat/demo-fullstack/tree/master/src в общих файлах общих файлов grunt: 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 amd: https://github.com/basarat/demo-fullstack/blob/master/src/Gruntfile.js#L37

Ответ 2

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

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

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

как в:

/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... 

не полагаясь на способность модуля "Экспортный модуль"

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

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

Typescript модули должны быть templatable, поэтому при компиляции модуль может иметь "форму", я хочу, не полагаясь на дополнительные шаги сборки

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

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

Browserify

amdefine

RequireJs в Node

Требовать ЗАГРУЗИТЬ МОДУЛИ ИЗ ПАКЕТОВ COMMONJS

Ответ 3

Должно быть возможно смешать требуемые файлы 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 - поскольку параметры компилятора для каждого проекта.
Решение этой проблемы может заключаться в том, чтобы вложенные подпроекты (.prj) TypeScript в подкаталоги вашего основного веб-приложения выглядят следующим образом:

+- / (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 )

Ответ 4

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