2016-05-22 5 views
0

Я работаю над библиотекой для экспресс-экспресс-экспресс. Цель состоит в том, чтобы установить некоторые стандарты организации для сервера останова узла, поэтому есть конкретный способ, которым я бы хотел, чтобы он работал.Скомпилировать машинописный текст без потери пути node_modules?

Для одного, вместо того, чтобы иметь клубок require Я хочу использовать явный импорт es6. Как this-

import ExpressKit from 'expresskit'; 

ExpressKit.start({ 
    port: 8000 
}); 

Я хочу, чтобы это сделать вместо var ExpressKit = require('expresskit'); по целому ряду причин. Во-первых, IDE знает, что такое импорт, в то время как требование теряет любой intellisense. Я не хочу использовать ссылки, потому что я хочу избежать тегов /// <reference/> во всех моих файлах. Во-вторых, при явном импорте es6 вам не нужны пространства имен/модули, поскольку путь действует как само пространство имен, например com.org.foo.bar. Вот пример маршрута с экспрессом-

import Route from 'expresskit/route'; 
import {Param} from 'expresskit/property'; 
import User from './'; 

export default class UserRouter { 
    @Route('GET', '/user/:id') 
    public static getUser(@Param('id') userId: number,) { 
    return new User(); 
    } 
} 

Вы точно знаете, что используется, откуда оно взялось. Объекты с глобальным охватом отсутствуют или ссылаются через пространство имен expresskit. Альтернатива была бы что-то вроде this-

/// <reference path="../node_modules/expresskit/expresskit.d.ts"/> 

var ExpressKit = require('expresskit'); 
var Route = ExpressKit.Route; 
var Param = ExpressKit.Param; 

import User from './'; 

export default class UserRouter { 
    @Route('GET', '/user/:id') 
    public static getUser(@Param('id') userId: number,) { 
    return new User(); 
    } 
} 

Так что проблема у меня и причина, почему я не могу получить явный импорт ES6 работать должным образом, когда машинописный скомпилирована с помощью tsc. Javascript построен в каталоге bld. Поскольку вы ссылаетесь на источник expresskit через импорт es6, он также создает это для bld. Результат выглядит this-

/
    bld/ 
     node_modules/ 
     expresskit/ 
      ... 
     user/ 
     index.js 
     router.js 
     index.js 
    node_modules/ 
     expresskit/ 
     ... 
     express/ 
     ... 
     body-parser/ 
     ... 
    user/ 
     index.ts 
     router.ts 
    index.ts 
    tsconfig.json 

Теперь, когда я запустить проект сборки, запустив node bld/index.js я получаю error-

Error: Cannot find module 'express'

Причина этого заключается в том, потому что, как expresskit bld/node_modules/expresskit/index.js звонит require('express'), что его ищет экспресс в bld/node_modules/, когда это фактическое местоположение находится в node_modules/.

Я не хочу копировать все от node_modules/ до bld/node_modules/, и если бы я это сделал, я думаю, что полезность библиотеки была бы сомнительной.

То, что я собираюсь сделать, заключается в компиляции в один файл с использованием systemjs вместо commonjs. Для этого потребуется скрипт пользовательской сборки, который вводит var System = require('systemjs') в начало встроенного файла. Но это может быть наименее инвазивным для моих вариантов. Это путь?

Итак, как я могу получить свой торт и съесть его?

+0

Почему вы храните два каталога 'node_modules'? Вы можете переместить 'bld/node_modules' в' node_modules'. https://nodejs.org/api/modules.html # modules_loading_from_node_modules_folders – Zen

+0

Я этого не делаю. Это результат строительства. Мне удалось найти решение с использованием sytemjs, но для этого требуется настраиваемый процесс сборки. Только несколько строк, но я собираюсь оставить это немного открытым, чтобы найти лучшее решение, прежде чем показывать свое решение. –

ответ

0

Хотя я предполагаю, что ОП решил проблему после более чем года, для всех, как это происходит позже, вот как это работает.

Вы только что добавили node_modules в список "exclude" в свой tsconfig.json файл. В то время как вы на это, можете добавить свою папку сборки, чтобы не перерабатывать ее каждый раз и добавлять лишние файлы (в результате чего такие папки, как bld/bld/bld/...) и строить время каждый раз, когда вы компилируете.

{ 
    "compilerOptions": { /* ... */ }, 
    "exclude": ["node_modules", "bld"] 
} 
Смежные вопросы