我正在使用一个名为expresskit的快速库。目标是为节点休息服务器设置一些组织标准,以便我有一种特定的方式来使用它。
首先,我想使用es6显式导入而不是纠缠require
。像这样 -
import ExpressKit from 'expresskit';
ExpressKit.start({
port: 8000
});
出于多种原因,我想这样做而不是var ExpressKit = require('expresskit');
。首先,IDE知道导入是什么,而要求失去任何智能感知。我不想使用引用,因为我想避免在我的所有文件中都使用/// <reference/>
标记。其次,使用es6显式导入,您不应该需要命名空间/模块,因为路径充当命名空间本身,如com.org.foo.bar
。以下是使用expresskit的路由示例 -
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导入引用了expresskit源代码,因此它也将此构建为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
来运行构建项目时,我收到了错误 -
错误:找不到模块&#39;表达&#39;
这是因为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')
编译为单个文件。这将需要一个自定义构建脚本,它将{{1}}注入到构建文件的顶部。但这可能是我选择中侵入性最小的。这是要走的路吗?
那我怎么能吃蛋糕呢?
答案 0 :(得分:1)
虽然我认为OP在一年多之后已经解决了他们的问题,但是对于大家来说,这里的问题是如何实现的。
您只需将node_modules
添加到"exclude"
文件的tsconfig.json
列表中即可。在您熟悉它的同时,不妨添加您的构建文件夹,以便每次都不重新处理它,并在每次编译时添加更多不必要的文件(产生bld/bld/bld/...
等文件夹)和构建时间。
{
"compilerOptions": { /* ... */ },
"exclude": ["node_modules", "bld"]
}