Возможно ли комбинировать модули 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. Наслаждайтесь!