我正在为一家名为“快车”的图书馆工作。我们的目标是为节点rest服务器设置一些组织标准,所以我希望它有一种特定的工作方式。
首先,我不想使用复杂的require,而是使用es6显式导入。就像这样-
import ExpressKit from 'expresskit';
ExpressKit.start({
port: 8000
});我想这样做,而不是var ExpressKit = require('expresskit');,有很多原因。首先,IDE知道导入是什么,而需求则会丢失任何intellisense。我不想使用引用,因为我希望避免在我的所有文件中使用/// <reference/>标记。其次,对于es6显式导入,您不应该需要名称空间/模块,因为路径充当名称空间itselfs,比如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命名空间进行引用。另一种选择是这样-
/// <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目录中。由于您是通过es6导入引用快捷短剧源,所以它也在将其构建为bld。结果是这样的-
/
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运行构建项目时,我得到了错误-
错误:找不到模块‘快递’
之所以这样做,是因为bld/node_modules/expresskit/index.js正在调用require('express'),当它的实际位置在node_modules/中时,它在bld/node_modules/中寻找快递。
我不想把所有东西从node_modules/复制到bld/node_modules/,如果这样做的话,我认为库的有用性是值得怀疑的。
我要做的是使用systemjs而不是commonjs编译成一个文件。这将需要一个自定义构建脚本,将var System = require('systemjs')注入到构建文件的顶部。但这可能是我的选择中最不具侵略性的。这是该走的路吗?
,那么我怎么才能把蛋糕也吃了呢?
发布于 2017-09-17 14:33:55
虽然我认为OP已经在一年多后解决了他们的问题,但是对于每个人来说,以后如何来到这里,这就是它的工作原理。
只需将node_modules添加到tsconfig.json文件中的"exclude"列表中即可。在进行编译时,最好添加构建文件夹,不要每次都重新处理它,添加更多不必要的文件(导致像bld/bld/bld/...这样的文件夹),每次编译时都需要构建时间。
{
"compilerOptions": { /* ... */ },
"exclude": ["node_modules", "bld"]
}https://stackoverflow.com/questions/37376338
复制相似问题