编译Typescript而不丢失node_modules路径?

时间:2016-05-22 15:41:42

标签: javascript node.js typescript ecmascript-6

我正在使用一个名为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}}注入到构建文件的顶部。但这可能是我选择中侵入性最小的。这是要走的路吗?

那我怎么能吃蛋糕呢?

1 个答案:

答案 0 :(得分:1)

虽然我认为OP在一年多之后已经解决了他们的问题,但是对于大家来说,这里的问题是如何实现的。

您只需将node_modules添加到"exclude"文件的tsconfig.json列表中即可。在您熟悉它的同时,不妨添加您的构建文件夹,以便每次都不重新处理它,并在每次编译时添加更多不必要的文件(产生bld/bld/bld/...等文件夹)和构建时间。

{
    "compilerOptions": { /* ... */ },
    "exclude": ["node_modules", "bld"]
}