Npm 被TypeScript使用的方式弄糊涂了;要求(……)”;

Npm 被TypeScript使用的方式弄糊涂了;要求(……)”;,npm,typescript,phaser-framework,Npm,Typescript,Phaser Framework,我试着读了几篇博客文章,但TypeScript模块仍然让我完全困惑。特别是,我使用了3个不同的模块(均通过npm安装),每个模块似乎表现出完全不同的行为: (1) 我可以从npm导入并使用Angular 2,就像在我的.ts中一样: 从'angular2/angular2'导入{bootstrap,Component,Directive,CORE_指令,FORM_指令} 在我的html中,我有: 其结果如下: TypeScript编译器知道在node_模块下查找angular2.d.ts文件

我试着读了几篇博客文章,但TypeScript模块仍然让我完全困惑。特别是,我使用了3个不同的模块(均通过npm安装),每个模块似乎表现出完全不同的行为:

(1) 我可以从npm导入并使用Angular 2,就像在我的.ts中一样:

从'angular2/angular2'导入{bootstrap,Component,Directive,CORE_指令,FORM_指令}

在我的html中,我有:

其结果如下:

  • TypeScript编译器知道在node_模块下查找angular2.d.ts文件,即使我刚才说的是“angular2/angular2”

  • TypeScript编译器向输出JavaScript添加
    “var angular2_1=require('angular2/angular2');

  • 尽管存在
    require
    ,但浏览器不会再次尝试加载angular2 JavaScript,它不知何故知道已经通过脚本标记中的“angular2.dev.js”加载了它

(2) npm D3模块没有typescript定义,但我可以从DefiniteTyped下载该定义,然后通过以下方式使用它:

//

在我的ts和

在我的html中。作为一个老式模块,它似乎不需要import语句,只要我把它留在这里,输出JavaScript就可以正常工作。如果我尝试在引用行之后立即使用import语句:

import*作为d3从'd3'导入;

然后,与Angular2一样,它现在添加了:

var d3=require('d3');

但是,与Angular不同的是,它没有意识到已经通过脚本标签加载了JavaScript,因此浏览器尝试从html文件所在的目录加载一个名为“d3”的文件,但失败了

(3) npm Phaser模块在npm模块的“typescript”子目录中包含一个.d.ts文件。这是一个老式模块(“declare module Phaser”),因此我似乎不需要使用“import..”语法,而只需要:

//

在我的.ts文件的顶部,与D3示例一样。TypeScript编译器很高兴,但与D3示例不同,在某些情况下(我还没有完全弄清楚,似乎并不总是发生),它输出:

var移相器_1=require('phaser');

在JavaScript中,即使我没有使用import语句,我在phaser项目中也没有使用commonjs/requirejs,所以甚至没有定义“require”,导致了失败

为了完整性,与Angular或D3示例不同,如果我尝试在参考线后面放一个import语句:

从“Phaser”导入*作为Phaser;

甚至TypeScript编译器也不满意。可能在D3示例中,TypeScript编译器以特殊方式处理DefiniteTyped中的tsd.json或typings文件夹,或者可能还有其他原因,导入为D3而不是Phaser编译

我有各种各样的问题:

1) 什么决定了TypeScript编译器在输出JavaScript中是否包含“require(…)”行

2) 在什么情况下,当使用“导入”时,TypeScript编译器知道在“npm_模块”中的何处找到外部模块,文件顶部是否需要引用行

3) 在什么情况下,当使用“导入”时,TypeScript编译器知道在“typings”中的何处找到环境模块,文件顶部有或没有“reference”行

4) 在什么情况下,当使用“导入”时,TypeScript编译器知道在“npm_模块”中的何处找到环境模块,文件顶部有或没有“引用”行

5) 可能是一个commonjs/requirejs问题,而不是一个typescript问题,但是如果typescript编译器在JavaScript中输出了一个“require”行,那么如果JavaScript模块的源没有使用ES6模块导出进行设置,您该怎么办

1)我可以从npm导入并使用Angular 2,就像在我的.ts中一样:

这是因为

  • angular2附带其
    .d.ts
    文件

  • 浏览器不会尝试读取
    require
    ,因为
    angular2.dev.js

npm D3模块出现故障&&相位器模块在运行时出现故障

他们没有你从angular2.dev.js获得的魔力。使用
webpack
browserify
之类的东西来提供这种魔力

与Angular或D3示例不同的是,如果我尝试在参考行后放置一条导入语句:
import*作为“Phaser”中的Phaser;

这是因为如何声明
Phaser
定义。显然,它缺少声明模块“Phaser”
,这是d3和angular提供的