Node.js】模块加载机制是啥

2020-11-24 10:20发布

7条回答
魏魏姐
2楼 · 2020-11-24 11:03

加载器的基本原理就是在html的head中插入script标签,通过这种方式加载远程js代码。其中。模块加载器通过依赖关系来保证代码的加在顺序以及执行顺序。因此开发人员在使用加载器时,不需要关注加载细节。

小小李兆佳
3楼 · 2020-11-24 11:03

1.模块查找规则-当模块拥有路径但没有后缀时:(require(‘./find’))

  • require方法根据模块路径查找模块,如果是完整路径,直接引入模块;

  • 如果模块后缀省略,先找同名JS文件,再找同名JS文件夹;

  • 如果找到了同名文件夹,找文件夹中的index.js;

  • 如果文件夹中你那个没有index.js,就会去当前文件夹中的package.js文件中查找mian选项中的入口文件;

  • 如果找指定的入口文件不存在,或者没有指定入口文件就会报错,模块没有被找到。

2.模块查找规则:当模块没有路径且没有后缀时:(require(‘find’)

  • Node.js会假设他是系统模块;

  • Node.js会去node_modules文件夹中;

  • 首先看是否有该名字的文件夹;

  • 如果是文件夹看里面是否有index.js;

  • 如果没有Index.js,查看文件夹中的package.json中的main选项确定模块入口文件;

  • 否则找不到报错。


想当熊猫
4楼 · 2020-11-24 16:32

1. 优先从缓存中加载

模块在第一次加载后会被缓存。 这也意味着多次调用 require() 不会导致模块的代码被执行多次。

注意:不论是内置模块、用户自定义模块、还是第三方模块,它们都会优先从缓存中加载,从而提高模块的加载效率。

2. 内置模块的加载机制

内置模块是由 Node.js 官方提供的模块,内置模块的加载优先级最高

例如,require(‘fs’) 始终返回内置的 fs 模块,即使在 node_modules 目录下有名字相同的包也叫做 fs。

3. 自定义模块的加载机制

使用 require() 加载自定义模块时,必须指定以 ./ 或 …/ 开头的路径标识符。在加载自定义模块时,如果没有指定 ./ 或 …/ 这样的路径标识符,则 node 会把它当作内置模块或第三方模块进行加载。

同时,在使用 require() 导入自定义模块时,如果省略了文件的扩展名,则 Node.js 会按顺序分别尝试加载以下的文件:

①按照确切的文件名进行加载

②补全 .js 扩展名进行加载

③补全 .json 扩展名进行加载

④补全 .node 扩展名进行加载

⑤加载失败,终端报错

4. 第三方模块的加载机制

如果传递给 require() 的模块标识符不是一个内置模块,也没有以 ‘./’ 或 ‘…/’ 开头,则 Node.js 会从当前模块的父目录开始,尝试从 /node_modules 文件夹中加载第三方模块。

如果没有找到对应的第三方模块,则移动到再上一层父目录中,进行加载,直到文件系统的根目录。

例如,假设在 ‘C:\Users\itheima\project\foo.js’ 文件里调用了 require(‘tools’),则 Node.js 会按以下顺序查找:

① C:\Users\itheima\project\node_modules\tools

② C:\Users\itheima\node_modules\tools

③ C:\Users\node_modules\tools

④ C:\node_modules\tools

5. 目录作为模块

当把目录作为模块标识符,传递给 require() 进行加载的时候,有三种加载方式:

①在被加载的目录下查找一个叫做 package.json 的文件,并寻找 main 属性,作为 require() 加载的入口

②如果目录里没有 package.json 文件,或者 main 入口不存在或无法解析,则 Node.js 将会试图加载目录下的 index.js 文件

③如果以上两步都失败了,则 Node.js 会在终端打印错误消息,报告模块的缺失:Error: Cannot find module ‘xxx’


小猪仔
5楼 · 2020-11-25 09:41

1. 优先从缓存中加载

模块在第一次加载后会被缓存。 这也意味着多次调用 require() 不会导致模块的代码被执行多次。

注意:不论是内置模块、用户自定义模块、还是第三方模块,它们都会优先从缓存中加载,从而提高模块的加载效率。

在这里插入图片描述

2. 内置模块的加载机制

内置模块是由 Node.js 官方提供的模块,内置模块的加载优先级最高。

例如,require(‘fs’) 始终返回内置的 fs 模块,即使在 node_modules 目录下有名字相同的包也叫做 fs。

3. 自定义模块的加载机制

使用 require() 加载自定义模块时,必须指定以 ./ 或 …/ 开头的路径标识符。在加载自定义模块时,如果没有指定 ./ 或 …/ 这样的路径标识符,则 node 会把它当作内置模块或第三方模块进行加载。

同时,在使用 require() 导入自定义模块时,如果省略了文件的扩展名,则 Node.js 会按顺序分别尝试加载以下的文件:

①按照确切的文件名进行加载

②补全 .js 扩展名进行加载

③补全 .json 扩展名进行加载

④补全 .node 扩展名进行加载

⑤加载失败,终端报错

4. 第三方模块的加载机制

如果传递给 require() 的模块标识符不是一个内置模块,也没有以 ‘./’ 或 ‘…/’ 开头,则 Node.js 会从当前模块的父目录开始,尝试从 /node_modules 文件夹中加载第三方模块。

如果没有找到对应的第三方模块,则移动到再上一层父目录中,进行加载,直到文件系统的根目录。

例如,假设在 ‘C:\Users\itheima\project\foo.js’ 文件里调用了 require(‘tools’),则 Node.js 会按以下顺序查找:

① C:\Users\itheima\project\node_modules\tools

② C:\Users\itheima\node_modules\tools

③ C:\Users\node_modules\tools

④ C:\node_modules\tools

5. 目录作为模块

当把目录作为模块标识符,传递给 require() 进行加载的时候,有三种加载方式:

①在被加载的目录下查找一个叫做 package.json 的文件,并寻找 main 属性,作为 require() 加载的入口

②如果目录里没有 package.json 文件,或者 main 入口不存在或无法解析,则 Node.js 将会试图加载目录下的 index.js 文件。

③如果以上两步都失败了,则 Node.js 会在终端打印错误消息,报告模块的缺失:Error: Cannot find module ‘xxx’


水默
6楼 · 2020-11-29 17:55
  • 包是更好的组织功能的代码结构

  • 当前指定一个文件夹,会将文件夹内的index.js作为程序的入口    3

  • 如果当前目录下有一个和文件夹同名的文件,优先加载文件        1

  • 如果当前目录下有一个和文件夹同名的json文件,优先加载json  2

  • 对于文件的加载,顺序是,如果你写上./xxx,优先会加载xxx.js/xxx.json/xxx.node

  • 加载优先级,例如: ./abc

    • 1:先检查当前目录下./abc目录中的package.json文件的main属性,满足就立刻加载

    • 2:加载当前路径下的./abc.js/json/node

    • 3:加载./abc目录中的index.js


天天
7楼 · 2020-11-29 21:27

1) 模块的类型

odeJS模块分为两类,一类是核心模块,一类是文件模块。

1,核心模块就是NodeJS标准中提供的模块,如fs、http、net、vm等,官方提供的模块,编译成了二进制代码,直接可以通过require获取核心模块,核心模块具有最高的加载优先级,如果有模块和其命名冲突,nodeJS总会加载核心模块

2,文件模块则是存储为单独的文件或者文件夹的模块,可能是JS代码、JSON或编译好的C/C++代码。在不显示指定文件模块扩展名的时候,NodeJS会分别试图加上.js、.json和.node扩展名

2)文件模块加载方式

文件模块的加载有两种方式,一种是按路径加载,一种是查找node——modules文件夹


挺好的
8楼 · 2020-11-30 07:56

加载器的基本原理就是在html的head中插入script标签,通过这种方式加载远程js代码。其中。模块加载器通过依赖关系来保证代码的加在顺序以及执行顺序。因此开发人员在使用加载器时,不需要关注加载细节。


相关问题推荐

  • 回答 1

    nodejs是单线程异步的,但是你可以启动多个server,相当于多用户可以使用多线程,一般是CPU有几个核就开几个server。

  • 回答 3

    初次接触nodejs确实有一些难度,因为思路语法都和js有了一些差别,属于后端思想,所以需要楼主多下功夫,进行系统学习之后就容易接受了

  • 回答 2

    node.js实际上来说是后台语言,应用广泛,当然跟php java这样成熟的语言相比还是差一点,但是前景很好,而且因为是用的js的语法来写后台,对于前端来说很容易上手,假如是刚开始学习前端的话node.js不需要学习,先把前端的js H5 css3学好才是正事,不过如果有...

  • 回答 3

    什么是JavaScript?JavaScript 是一种语言,JavaScript的标准是 ECMAScript。什么是 ECMAScript?我们说的 ES5, ES6……就是指的 ECMAScript 不同标准。ECMAScript 只是一个标准,而JavaScript是对这个标准的实现。为啥不继续叫 JavaScript?因为 Oracle 拥有...

  • 回答 1

    根据百度百科上面的解释我们可以知道node.js是一个Javascript运行环境(runtime environment),实质是对Chrome V8引擎进行了封装;node.js不是一个 JavaScript 框架,也不是浏览器端的库,node.js是一个让 JavaScript 运行在服务端的开发平台,它让 JavaScri...

  • 回答 5

    看你规模有多大了,Node.js 能够适应大规模项目开发没有问题。Nodejs是一种单线程、非阻塞的机制。有他自身的优势!

  • node.js是什么Node.js 2022-02-11 10:05
    回答 3

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型。Node 是一个让 JavaScript 运行在服务端的开发平台,它让 JavaScript 成为与PHP、Python、Perl、Ruby 等服务端语言平起平坐的脚本语言。...

  • 回答 2

    Node.js更多是作为中间层的存在,不能替代纯后端,让服务器的压力更小,让前端的开发更简洁等...

  • 回答 1

    首先前后端在定接口的时候是要复提前约定的。一方提出我接制收的数据格式必须是 JSON,另一方必须按规则提交知。如果你想做容错的道话,可以根据 content type 判断(application/json)。...

  • 回答 3

    node是js的运行时,可以通过node编写后台服务器,但是原生弄得写起来会比较麻烦,就会使用框架:express;基础主要有设置路由,添加中间件,和模板和静态资源目录等功能

  • 回答 4

    当然可以,国外的Uber 和LinkedIn,国内阿里系的不少产品都是用node开发的,node 的强项就是处理高并发。

  • 回答 10

    Node js之使用应用生成器来搭建第一个基于express的应用以前的开发中在构建一个express项目时,还是需要我们写很多的代码,还不够强大。我们可以借助应用生成器,帮我们把项目的基本骨架搭建好。一般提到开发,通常有如下几种:•   原生开发,所有的代码从...

  • 回答 11

    jsp本质就是一个Servlet.所有jsp页面都需要在服务器端运行。首先将jsp页面翻译成.java源文件,也就是servlet文件,再将servlet编译成.class文件,最后运行字节码文件。这是首次执行一个jsp页面必须经历的三个过程,如果是再次访问(在没有修改源代码的基础上...

  • 回答 8

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。(事件驱动:事件触发过程中,进行决策的一种策略,简单说就是跟随当前时间点上出现的事物,调用可用的资源进行解决该事物...

  • 回答 2

    node开发的时候都用框架,在处理post的请求的时候,大部分都是使用中间件来进行处理

没有解决我的问题,去提问