node中的require是如何加载模块的

在使用node引入模块的时候,我发现node自带的模块或是npm安装的第三方模块,只需要require个名字就可以加载到了,像是

require('fs')
require('http')
require('express')

但是自己写的模块就必须要加上路径,比如

require('./a')
require('a')//这样就不行,

为什么第三方模块就不需要加路径呢?express的路径明明是node_modules/express/index.js

那是不是我把自己写的模块放到node_modules目录下就不需要写路径了呢,于是我在node_modules目录下创建了

然后直接require(‘a‘),果然不报错了。

这其中必有蹊跷啊,查了一圈,终于弄明白了require的加载规则

node自带的核心模块

核心模块的本质也是文件,但是我们看不到,因为他们已经被编译到了二进制文件中了,我们只需要按照名字来加载就可以了。

自定义模块

需要以路径形式引用,如果不写路径,会被认为是核心模块或是第三方模块,

require(‘a‘)就会去找这个名字的核心模块和第三方模块,找不到就报错了。

第三方模块

以express为例

node在require时会先判断你是不是核心模块,或者是不是路径形式的模块,如果都不是

就会先找到当前文件所处目录中的node_modules 目录,然后一级一级向下找

node_modules/express
node_modules/express/package.json
node_modules/express/package.json 中的 main 属性

这个main属性中就记录了express的入口模块

然后加载使用这个第三方包

如果package.json文件不存在或者 main指定的入口模块也没有

则node会自动找该目录下的index.js

也就是说 index.js 会作为一个默认备选项

如果以上所有任何一个条件都不成立,则会进入上一级目录中的node_modules目录查找

如果上一级还没有,则继续往上上一级查找

如果直到当前磁盘根目录还找不到,最后报错:can not find module xxx

原文地址:https://www.cnblogs.com/imjtzhang/p/11951842.html

时间: 2024-07-29 10:30:50

node中的require是如何加载模块的的相关文章

使用node中的express解决vue-cli加载不到dev-server.js的问题

在使用vue开发过程中,难免需要去本地数据地址进行请求,而原版配置在dev-server.js中,新版vue-webpack-template已经删除dev-server.js,改用webpack.dev.conf.js代替,所以 配置本地访问在webpack.dev.conf.js里配置即可. 现在我们就来用node里的express来解决本地数据请求的问题.主要为下面三步:安装express和resource.注册并使用vue-resource.配置express并设置路由规则 1.安装no

node中的require

1 /*在node中,可以使用require()函数来加载模块. 2 * require函数使用一个参数,参数值可以带有完整路径的模块的文件名,也可以为模块名.当使用node中提供的模块时,在require函数中只需要指定模块名即可. 3 * */ 4 //建立一个页面2.js;代码如下 5 var name="思思博士"; 6 exports.name=name; 7 //建立一个页面1.js;代码如下 8 var two=require("./2.js"); 9

关于AMD(异步加载模块)和CMD(同步加载模块),require.js

1.CommonJS,有一个全局性方法require(),用于加载模块.假定有一个数学模块math.js,就可以像下面这样加载. var math = require('math'); 然后,就可以调用模块提供的方法: var math = require('math'); math.add(2,3); // 5 第二行math.add(2, 3),在第一行require('math')之后运行,因此必须等math.js加载完成.也就是说,如果加载时间很长,整个应用就会停在那里等. 这对服务器端

[Node.js]node中的require到底是怎样工作的

关于require 但凡使用过node.js/io.js,必定都会用到require这个函数来引用其它模块(自己写的或他人的).但很多人(包括本人)都没有把node中关于require(在文档中modules这一部份)介绍认真看过一遍. 这里先介绍一下大家可能都已熟知的情况: 文件加载 node中在使用require加载文件时,会尝试在引用文件名不存在的情况下,依次加上.js..node..json这三个后缀名来试错.注意,这里指的是引用文件名对应文件不存在的情况下. 例如,当你在代码中使用re

安卓中实现界面数据懒加载

大家在使用手机新闻客户端的时候就会有一个发现,大多数的新闻客户端都会把新闻分类,诸如头条.娱乐.体育.科技等等,如何实现这种界面的呢?这个实现起来其实很简单,就是在一个Fragment中实现多个ViewPage的切换,再在ViewPage的上面放一个TabLayout,关联起来就可以实现联动效果.如果大家感觉不太明了的话,以后我可以专门写一篇关于Fragment中放入多个ViewPage的博客,今天,我主要介绍的是怎样实现界面即Fragment的懒加载.那么,大家就会奇怪了既然是加载界面直接加载

代码中使用bitmap资源并加载到控件上

1.从res/drawable/XX.jpg里引用图片资源: 1. Resources res = getResources(); Bitmap inDrawable= BitmapFactory.decodeResource(res, R.drawable.user_img_grey); userImgButton.setImageBitmap(inDrawable ); 2.从本地sd卡的文件路径中使用图片资源: UserImgPath=Environment.getExternalStor

Android在layout xml中使用include完成静态加载

Android在layout xml中使用include完成静态加载 include静态加载:不仅可以加载布局,还可以加载控件(控件标签名要在最外层)include标签中有个layout属性就是专门用来加载的. 在Android的layout样式定义中,可以使用xml文件方便的实现,有时候为了模块的复用,使用include标签可以达到此目的.例如: <include layout="@layout/otherlayout"></div> android开发的官方

磁盘中运行的程序必须加载到内存才能运行的原因

计算机中主要的存储部件是内存和磁盘.磁盘中存储的程序必须加载到内存之后才能运行.在磁盘中保存的原始程序是无法直接运行的.这是因为,负责解析和运行程序内容的CPU,需要通过内部程序计数器来指定内存地址,然后才能读出程序.即使CPU可以直接读出并运行磁盘中保存的程序,由于磁盘读取速度慢,程序的运行速度还是会降低的.总之,存储在磁盘中的程序需要读入到内存后才能运行. 原文地址:http://blog.51cto.com/bantu/2119841

深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么 - Part 1

背景 “从浏览器中输入URL到页面加载的发生了什么“,这是一道经典的面试题,涉及到的知识面非常多,但作为一个自认为对网络知识掌握的比较好的老码农来说,回答这个问题自然不在话下.如果这道题目如果在面试出现,对我来说就是送分题啊.尽管如此,我还是愿意花一些时间根据我自己的理解回答一下这个题目,看我自己到底掌握的有多深,同时也把自己的知识梳理一下. 这让我想起另外一件往事,这道题有点类似于“在手机上浏览器上输入一个URL,手机做了一些什么”,我当时学习通信里的核心网时就给自己提出过这个问题. 我非常愿