Я работаю над библиотекой для экспресс-экспресс-экспресс. Цель состоит в том, чтобы установить некоторые стандарты организации для сервера останова узла, поэтому есть конкретный способ, которым я бы хотел, чтобы он работал.Скомпилировать машинописный текст без потери пути 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')
в начало встроенного файла. Но это может быть наименее инвазивным для моих вариантов. Это путь?
Итак, как я могу получить свой торт и съесть его?
Почему вы храните два каталога 'node_modules'? Вы можете переместить 'bld/node_modules' в' node_modules'. https://nodejs.org/api/modules.html # modules_loading_from_node_modules_folders – Zen
Я этого не делаю. Это результат строительства. Мне удалось найти решение с использованием sytemjs, но для этого требуется настраиваемый процесс сборки. Только несколько строк, но я собираюсь оставить это немного открытым, чтобы найти лучшее решение, прежде чем показывать свое решение. –