tsconfig.json
如果一个目录下存在一个tsconfig.json
文件,那么它意味着这个目录是TypeScript项目的根目录。 tsconfig.json
文件中指定了用来编译这个项目的根文件和编译选项。
可以手动创建tsconfig.json
文件,也也可以通过tsc —init
创建。
可以通过 compilerOptions
来定制编译选项,这边就写一点常见(我常见)的:
1 | { |
模块
全局模块
两个ts
文件在同一个目录下,这样声明a
相当于在全局中声明
文件模块
使用export
或者import
,会在文件中创建一个本地作用域
正确的使用方式:
相对模块路径:
当使用import { b } from "./moduleB"
的时候,在/root/src/moduleA.ts
里
/root/src/moduleB.ts
/root/src/moduleB.tsx
/root/src/moduleB.d.ts
/root/src/moduleB/package.json
(如果指定了"types"
属性)/root/src/moduleB/index.ts
/root/src/moduleB/index.tsx
/root/src/moduleB/index.d.ts
非相对模块路径:
当导入不是相对模块路径的时候,当你使用 import { b } from "moduleB"
,它是在/root/src/folder/A.ts
文件里,会按照下面顺序查找
/root/src/node_modules/moduleB.ts
/root/src/node_modules/moduleB.tsx
/root/src/node_modules/moduleB.d.ts
/root/src/node_modules/moduleB/package.json
(如果指定了"types"
属性)/root/src/node_modules/moduleB/index.ts
/root/src/node_modules/moduleB/index.tsx
/root/src/node_modules/moduleB/index.d.ts
/root/node_modules/moduleB.ts
/root/node_modules/moduleB.tsx
/root/node_modules/moduleB.d.ts
/root/node_modules/moduleB/package.json
(如果指定了"types"
属性)/root/node_modules/moduleB/index.ts
/root/node_modules/moduleB/index.tsx
/root/node_modules/moduleB/index.d.ts
/node_modules/moduleB.ts
/node_modules/moduleB.tsx
/node_modules/moduleB.d.ts
/node_modules/moduleB/package.json
(如果指定了"types"
属性)/node_modules/moduleB/index.ts
/node_modules/moduleB/index.tsx
/node_modules/moduleB/index.d.ts
在步骤(8)和(15)向上跳了两次目录
NodeJS如何解析模块:
在Node.js里导入是通过require
函数调用进行的。 Node.js会根据 require
的是相对路径还是非相对路径做出不同的行为。
相对路径:
假设有一个文件路径为 /root/src/moduleA.js
,包含了一个导入var x = require("./moduleB");
Node.js以下面的顺序解析这个导入:
- 检查
/root/src/moduleB.js
文件是否存在。 - 检查
/root/src/moduleB
目录是否包含一个package.json
文件,且package.json
文件指定了一个"main"
模块。 在我们的例子里,如果Node.js发现文件/root/src/moduleB/package.json
包含了{ "main": "lib/mainModule.js" }
,那么Node.js会引用/root/src/moduleB/lib/mainModule.js
。 - 检查
/root/src/moduleB
目录是否包含一个index.js
文件。 这个文件会被隐式地当作那个文件夹下的”main”模块。
非相对路径:
Node会在一个特殊的文件夹 node_modules
里查找你的模块。node_modules
可能与当前文件在同一级目录下,或者在上层目录里。 Node会向上级目录遍历,查找每个node_modules
直到它找到要加载的模块。
还是用上面例子,但假设/root/src/moduleA.js
里使用的是非相对路径导入var x = require("moduleB");
。 Node则会以下面的顺序去解析 moduleB
,直到有一个匹配上。
/root/src/node_modules/moduleB.js
/root/src/node_modules/moduleB/package.json
(如果指定了"main"
属性)/root/src/node_modules/moduleB/index.js
/root/node_modules/moduleB.js
/root/node_modules/moduleB/package.json
(如果指定了"main"
属性)/root/node_modules/moduleB/index.js
/node_modules/moduleB.js
/node_modules/moduleB/package.json
(如果指定了"main"
属性)/node_modules/moduleB/index.js
注意Node.js在步骤(4)和(7)会向上跳一级目录。
TS调用Js
index.ts
1 | import { b } from './untils/untils'; |
untils.d.ts
1 | export declare const b:number |
untils.js
1 | export const b = 1; |
实际的项目里,建议把声明放在.d.ts
文件内,当然放在ts
文件里也可以