Npm 被TypeScript使用的方式弄糊涂了;要求(……)”;
我试着读了几篇博客文章,但TypeScript模块仍然让我完全困惑。特别是,我使用了3个不同的模块(均通过npm安装),每个模块似乎表现出完全不同的行为: (1) 我可以从npm导入并使用Angular 2,就像在我的.ts中一样: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文件
从'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提供的