2015-04-14 3 views
1

Я занимаюсь использованием компиляции AMD, а не машинописными внутренними модулями.Ссылка на requirejs оптимизированные классы машинописного текста

У меня есть проект, полный классов и интерфейсов типов, которые я успешно оптимизировал в файле requirejs, полном requirejs.

, например

класса А { ... } экспорт A;

Другие классы ссылаются на файл и импортируют класс штрафа.

В другом проекте я втягиваю оптимизированный файл R.js с помощью bower и ссылаюсь на него в require_config.js и загружаю файл в порядке.

В этом другом проекте я хочу, чтобы класс B ссылался на класс A, но класс B не находится в пути к файлу.

Что мне нужно делать? Думаю, мне нужно сгенерировать d.ts-файлы, которые я ссылаюсь в классе B, но как мне импортировать ClassA = require («ClassA»), когда ClassA не находится в пути к файлу второго проекта.

Джеймс

+0

Я не вижу, где ваш пример показывает, что вы используете requireJS. В любом случае вы должны иметь доступ к classB, используя его относительный путь от корня сайта. –

+0

Если я скомпилировал класс A с -m AMD, я бы получил файл js, который бы выглядел так: define (["require", "export", dependencies], function (require, exports, dependencies) { return ClassA }) ; – jmc42

+0

'но класс B не находится в пути к файлу' ... class A или B? – Paleo

ответ

0

Да, второй проект может использовать файл определения .d.ts:

// ---------- projectA.d.ts ---------- 
declare module "projectA" { 
    export class A { 
     // ... 
    } 
} 

// ---------- ClassB.ts ---------- 
import projectA = require("projectA"); // Use the definition in projectA.d.ts 
var a = new projectA.A(); 

Смотрите раздел "Окружающие Внешние модули" in the Handbook.

Вы можете автоматически сгенерировать единый файл описания определений с вашего проекта А с помощью dts-generator.

+0

То, что я нахожу под вопросом, заключается в том, что при создании класса A для использования с requirejs вы не используете модуль ключевых слов (который используется внутренней системой модуля ). если вы скомпилируете класс A с флагом -d, вы получите ClassA.d.ts, но у него нет объявления модуля, подобного тому, которое вы описываете. Есть ли способ получить компилятор для вывода d.ts с объявлением модуля, например, вашего файла из ваших собственных источников. Единственный способ сделать это - использовать ключевое слово модуля (т. Е. Только когда вы используете внутреннюю модульную систему машинописного текста?) – jmc42

+0

AFAIK, нет, вы не можете. Но вы можете сгенерировать файл '.d.ts' затем измените его, чтобы добавить 'declare module' и' export'. – Paleo

+0

Остерегайтесь цитат. С кавычками: 'declare module 'projectA" 'here'" projectA "' является внешним модулем. Без кавычек: 'declare module ProjectA' здесь' ProjectA '- внутренний модуль (т.е. пространство имен). – Paleo

0

После моего комментария о том, что projectA не был определен, когда я сделал var a = new projectA.A(), я обнаружил, что причина этого заключается в том, что был создан оптимизированный файл R.js (projectA.js) - ему понадобилось добавить insertRequire в сборку R.js. Это вызвало необходимость вызова ["projectA"] при загрузке projectA, а projectA был создан правильно.

Здесь есть немало движущихся частей. Жаль, что внешние модули и внутренние модули машинописного текста работают по-разному. В зависимости от синтаксиса объявлять модуль «SomeModuleName» и объявлять модуль SomeModuleName для различения с использованием кавычек между внешними и внутренними модулями является запутанным.

Было бы здорово, если бы синтаксис был одинаковым, а флаг-компилятор -m обрабатывал все основные детали.

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