Typescript和Node模块解析策略

一般我们在模块化编码时,总会导入其它模块,通常我们使用如下语法:

import { A } from ‘./a‘; // ES6语法
import { A } from ‘a‘;
var A = require(‘./a‘); // commonjs规范

不论使用哪种语法,导入的文件一般有两种:内部文件(自己开发的)和外部(node_modules)中两种,其中导入内部模块称之为相对导入,导入node_modules中,称之为非相对导入,它们在语法上的区别就是导入的路径是否是相对的

接下来我们看看typescript和node中它们是如何解析模块的

Typescript模块解析策略

我们知道import语法用来导入某个文件,

import { A } from ‘./a‘;   // 相对导入
import { A } from ‘../a‘;  // 相对导入
import { Express } from ‘express‘; // node_modules中模块

接下来我们看下这种两种方式在解析时有什么区别?

相对导入

假如b.ts路径是:/root/src/b.ts

import { A } from ‘./a‘;

typescript编译器在查找a模块时会依次按照如下顺序查找,如果仍然找不到则会模块找不到的错误。

/root/src/a.ts
/root/src/a.tsx
/root/src/a.d.ts
/root/src/a/package.json (如果指定了"types"属性,则使用types中)
/root/src/a/index.ts
/root/src/a/index.tsx
/root/src/a/index.d.ts

非相对导入

假如b.ts路径是:/root/src/b.ts

import { A } from ‘a‘;

typescript编译器在查找a模块时会按照如下顺序查找:

/root/src/node_modules/a.ts
/root/src/node_modules/a.tsx
/root/src/node_modules/a.d.ts
/root/src/node_modules/a/package.json
/root/src/node_modules/a/index.ts
/root/src/node_modules/a/index.tsx
/root/src/node_modules/a/index.d.ts

/root/node_modules/a.ts
/root/node_modules/a.tsx
/root/node_modules/a.d.ts
/root/node_modules/a/package.json
/root/node_modules/a/index.ts
/root/node_modules/a/index.tsx
/root/node_modules/a/index.d.ts

/node_modules/a.ts
/node_modules/a.tsx
/node_modules/a.d.ts
/node_modules/a/package.json
/node_modules/a/index.ts
/node_modules/a/index.tsx
/node_modules/a/index.d.ts

其中在上面两处空白行处,编译器会跳到上一级目录查找,直到到工程根目录

注意:有时候我们在导入外部模块(没有ts文件,只有),编译器会报模块找不到,但是我们node_modules确实有,这种方式不是编译器bug而需要我们在配置文件tsconfig.json中修改模块解析策略:

 "moduleResolution": "node"

说到这里我们看看Nodejs时如何解析模块的,NodeJs使用了commonjs模块规范,typescript编译和其大同小异。

Nodejs相对导入

假如b.ts路径是:/root/src/b.js

var A = require(‘./a‘)

typescript编译器在查找a模块时会按照如下顺序查找:

/root/src/a.js
/root/src/a/package.json (如果指定了"main"属性,则使用main中的)
/root/src/a/index.js

上述第二步中,假如main:"./core/main.js",则最终模块路径:

/root/src/a/core/main.js

Nodejs非相对导入

var A = require(‘a‘)

typescript编译器在查找a模块时会按照如下顺序查找:

/root/src/node_modules/a.js
/root/src/node_modules/a/package.json (如果指定了"main"属性,则使用main中的)
/root/src/node_modules/a/index.js

/root/node_modules/a.js
/root/node_modules/a/package.json (如果指定了"main"属性,则使用main中的)
/root/node_modules/a/index.js

/node_modules/a.js
/node_modules/a/package.json (如果指定了"main"属性,则使用main中的)
/node_modules/a/index.js

原文地址:https://www.cnblogs.com/winfred/p/8179815.html

时间: 2024-08-01 17:28:58

Typescript和Node模块解析策略的相关文章

Python命令行选项參数解析策略

概述 在Python的项目开发过程中,我们有时须要为程序提供一些能够通过命令行进行调用的接口.只是,并非直接使用 command + 当前文件 就ok的,我们须要对其设置可选的各种各样的操作类型.所以,这样的情况下我们就有必要对传入的參数进行解析操作. 以下就此问题提出几种不同的解决策略.希望于你故意. 版权说明 著作权归作者全部. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:Coding-Naga 发表日期: 2016年3月18日 链接:http://blog.csdn.net/

Python命令行选项参数解析策略

概述 在Python的项目开发过程中,我们有时需要为程序提供一些可以通过命令行进行调用的接口.不过,并不是直接使用 command + 当前文件 就ok的,我们需要对其设置可选的各种各样的操作类型.所以,这种情况下我们就有必要对传入的参数进行解析操作.下面就此问题提出几种不同的解决策略,希望于你有益. 版权说明 著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:Coding-Naga 发表日期: 2016年3月18日 链接:http://blog.csdn.net/l

【转】Commonjs规范及Node模块实现

前言: Node在实现中并非完全按照CommonJS规范实现,而是对模块规范进行了一定的取舍,同时也增加了少许自身需要的特性.本文将详细介绍NodeJS的模块实现 引入 nodejs是区别于javascript的,在javascript中的顶层对象是window,而在node中的顶层对象是global [注意]实际上,javascript也存在global对象,只是其并不对外访问,而使用window对象指向global对象而已 在javascript中,通过var a = 100:是可以通过wi

nginx源码分析--nginx模块解析

nginx的模块非常之多,可以认为所有代码都是以模块的形式组织,这包括核心模块和功能模块,针对不同的应用场合,并非所有的功能模块都要被用到,附录A给出的是默认configure(即简单的http服务器应用)下被连接的模块,这里虽说是模块连接,但nginx不会像apache或lighttpd那样在编译时生成so动态库而在程序执行时再进行动态加载,nginx模块源文件会在生成nginx时就直接被编译到其二进制执行文件中,所以如果要选用不同的功能模块,必须对nginx做重新配置和编译.对于功能模块的选

node模块机制

一.node模块化机制 1.commonJS模块规范包括三部分:模块引用.模块定义.模块标识.例如: //math.js exports.add = function(){    var sum = 0;    var args = arguments;    var len = args.length;    for(var i = 0;i < len;i++){        var num = args[i];        sum += num;    }    return sum;}

perl核心模块解析(一)POSIX

perl核心模块解析(一)    POSIX 详细文档链接如下 源自:http://blog.csdn.net/jonathanxqs 转自:http://perldoc.perl.org/POSIX.html POSIX/?p?z?ks/, 是可移植操作系统接口(Portable Operating System Interface ),POSIX标准定义了操作系统应该为应用程序提供的接口标准,是IEEE为要在各种UNIX操作系统上运行的软件而定义的一系列API标准的总称,其正式称呼为IEEE

node模块系统常用命令

node模块系统常用命令 命令 示例 备注 安装模块 npm install commander 最新版本 npm install [email protected] 指定版本 npm install [email protected] 支持通配符,代表1.0版本下的最新补丁 npm install [email protected]"" 支持版本范围描述,代表最新版本 npm install [email protected]"*" 支持版本范围描述,代表最新版本

C++版的网络数据包解析策略(升级版)

初版:http://www.cnblogs.com/wjshan0808/p/6580638.html 说明:在实现了对应的接口后该策略可以适合绝大多数的网络数据包结构 首先,是三个接口 IProduceProxy.h #ifndef _I_PRODUCE_PROXY_H_ #define _I_PRODUCE_PROXY_H_ //Code #define CODE_PRODUCE_PROXY_OK 0x00 //OK #define CODE_PRODUCE_PROXY_NI 0x01 //

Node.js解析Excel

1.使用node-xlsx包 var xlsx = require('node-xlsx'); 只支持xlsx格式 2.解析的Excel文件格式如下: 3.程序如下: var obj = xlsx.parse('D:/test.xlsx'); //第一个工作表的数据 var data = obj.worksheets[0].data; //列数 var maxCol = obj.worksheets[0].maxCol; //行数 var maxRow = obj.worksheets[0].m