2013-11-26 3 views
1

Я использую TypeScript для кода моего файла javascript с объектно-ориентированным программированием. Я хочу использовать модуль узла https://npmjs.org/package/typescript-require, чтобы потребовать, чтобы мои файлы .ts из других файлов.TypeScript use typescript-требуют общих файлов

Я хочу поделиться своими файлами на сервере и на стороне клиента. (Браузер) И это очень важно. Обратите внимание, что папка /shared/ не означает общий доступ между клиентом и сервером, но между игровым сервером и веб-сервером. Поэтому я использую pomelo.js в качестве рамки.

На данный момент я не использую (успешно) библиотеку, требующую ввода текста. мне нравится, что:

разделяемые/Lib/message.js

var Message = require('./../classes/Message'); 
module.exports = { 

    getNewInstance: function(message, data, status){ 
     console.log(requireTs);// Global typescript-require instance 
     console.log(Message); 
     return new Message(message, data, status); 
    } 
}; 

Этот файл необходимо в Message.js для создания новых экземпляров.

поделился/classes/Message. ц

class Message{ 
    // Big stuff 
} 
try{ 
    module.exports = Message; 
}catch(e){} 

В конце фил я добавить эту TRY/поймать, чтобы добавить класс к module.exports, если он существует. (Это работает, но это не очень хороший способ сделать это, я хотел бы сделать лучше) Если я загружу файл из браузера, module.export не будет существовать.

Итак, что я делал выше, работает. Теперь, если я пытаюсь использовать машинопись-модуль требует, я изменю некоторые вещи:

разделяемые/Lib/message.js

var Message = requireTs('./../classes/Message.ts'); 

я использую requireTs вместо требуется, это глобальная переменная , Я точно использую .ts файл.

поделился/classes/Message. ц

export class Message{ 
    // Big stuff 
} 
// remove the compatibility script at the end 

Теперь, если я пытаюсь как это, и если я взгляну на сервер консоли, я получаю requireTs это объект и сообщение не определено в разделяемых/Lib/message.js. Я получаю то же самое, если я не использую ключевое слово в сообщении. ts. Даже если я использую свой маленький скрипт в конце, у меня всегда появляется ошибка.

Но есть еще, у меня есть другое имя класса ValidatorMessage. ts который распространяется Сообщение. ц, он не работает, если я использую экспорта ключевое слово ...

ли я сделал что-то не так? Я пробовал несколько других вещей, но ничего не работает, похоже, что requirecript-require не может требовать .ts файлов. Благодарим вас за помощь.

ответ

1

Глядя на библиотеку требующих типографики, я вижу, что она не обновлялась в течение 9 месяцев. Поскольку он включает в себя lib.d.ts, типичный для TypeScript (и ввода node.d.ts), и поскольку они значительно продвинулись за последние 9 месяцев (наряду с необходимыми изменениями из-за языковых обновлений), это, вероятно, несовместимо с последними версиями TypeScript (просто мое предположение, я могу ошибаться).

Совместное использование модулей между узлом и браузером непросто с помощью TypeScript, поскольку они используют очень разные системы модулей (CommonJS в узле и, как правило, что-то вроде RequireJS в браузере). TypeScript испускает код для одного или другого, в зависимости от заданного параметра -module. (Примечание. Существует шаблон универсального модуля (UMD), который используют некоторые люди, но TypeScript не поддерживает это напрямую).

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

+0

Что я хочу сделать, это иметь файлы, совместно используемые между сервером и клиентом, а это означает, что сервер будет использовать непосредственно файл, написанный с использованием TypeScript, но клиент получит файл, объединенный с большим количеством других файлов, и zipped, и я необходимо, чтобы файлы были совместимы как с клиентом (браузером), так и с сервером. Я буду использовать Grunt для объединения и минимизации файлов. – Vadorequest

+1

Клиент и сервер не будут запускать TypeScript напрямую, а Grunt не будет минимизировать TypeScript, поэтому вам придется сначала скомпилировать JavaScript. В настоящее время самым простым решением будет скомпилировать один и тот же источник TypeScript дважды, один раз для -module CommonJS и один раз для -module AMD, а затем включить испускаемый код в серверных и клиентских пакетах с уважением. –

+0

Я не знаю разницу между этими модулями? Зачем так? Один для «сервера», а другой для «браузера»? Почему есть разница и какая разница в выходе? Благодаря! – Vadorequest

0

Решение здесь: Inheritance TypeScript with exported class and modules

Наконец я не использую требует, машинопись, но typescript.api вместо этого, он работает хорошо. (Вы должны загрузить lib.d.ts, если вы его используете, иначе вы получите некоторые ошибки на консоли.

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

Спасибо за вашу помощь Биллу.

+0

Наконец, typescript.api дерьмо с наследованием и не должен использоваться, если вы хотите использовать как AMD, так и CommonJs, не управляйте наследованием CommonJs и не сходите с ошибками в глубине кода ... – Vadorequest

1

Я делаю то же самое и держать возникают проблемы с какой стороны я стараюсь делать все ... Основные проблемы для меня:

  • Я пишу свой машинопись как пространства имен и компоненты, поэтому нет никакого модуля экспорта с несколькими компиляциями файлов, которые вы должны сделать, чтобы добавить некоторый _exporter.ts в конце, чтобы добавить экспорт для вашего library-output.js, чтобы быть импортируемым в качестве модуля, это потребовало бы что-то вроде:

module.exports.MyRootNamespace = MyRootNamespace

  • Если вы выше она работает, но тогда вы получите вопрос о том, когда вам нужно ссылаться на классы из других модулей (например, MyRootNamespace1.SomeClass быть ссылка на MyRootNamespace2.SomeOtherClass), вы можете ссылаться на нее, но затем она скомпилирует ее в вашу library-output2.js, так что у вас есть дубликаты классов, если вы пытаетесь повторно использовать машинопись для нескольких компилируемых целей (например, как у вас будет 1 решение в VS и несколько проектов, имеющих собственные выходы DLL)

  • Предполагая, что вы не довольны взломом экспорта и/или дублированием ваших ссылок, тогда вы можете просто импортировать их в глобальную область, которая является взломом, но работает ... однако затем, когда вы решите, что хотите протестировать свой код (используя любую инфраструктуру тестирования nodejs) вам нужно будет издеваться над определенными вещами, и поскольку зависимости для ваших компонентов могут не включаться через вызов require() (и ваш модуль может зависеть от node_modules, которые на самом деле не могут использоваться при взломе глобальной области), и это затрудняет удовлетворяют зависимостям и издеваются над определенными, как все или ничего подход.

  • Наконец, вы можете попытаться смягчить все эти проблемы, используя фреймворк типа, такой как appex, который позволяет вам запускать свой машинописный текст напрямую, а не компилировать в js в первую очередь, и, хотя кажется, что очень хорошо, он очень ОЧЕНЬ чтобы отлаживать ошибки компиляции, в настоящее время это мой предпочтительный способ, но у меня есть проблема, когда мои машинописи компилируются с помощью tsc, но просто взрываются с максимальным исключением размера стека на апелкс, и я нахожусь во власти разработчика проекта, чтобы исправить это (Я не смог найти основную проблему). Есть также не так много таких проектов, однако они делают проблему компиляции на уровне модуля/уровне файла и т. Д. Спорным моментом.

В конце концов у меня не было ничего, кроме проблем, которые пытаются бороться с машинопись, чтобы заставить его работать в пути, который является ремонтопригодны и проверяемым. Я также пытаюсь повторно использовать некоторые компоненты машинописного текста на стороне клиента, однако, если вы спуститесь по маршруту hpm hack, чтобы включить ваши модули, вам необходимо убедиться, что ваша клиентская сторона использует загружаемый загрузчик/пакетный загрузчик require. Насколько мне хотелось бы просто использовать машинописный текст на моем клиенте и моих проектах на сервере, он просто не хочет работать красиво.

Смежные вопросы