凌霄什么意思| 得了梅毒会有什么症状| 安抚奶嘴什么时候开始用| 心博是什么意思| 银离子是什么| 有什么花| 蜗牛的天敌是什么| 玉米有什么营养| 夏至是什么意思| 鲷鱼是什么鱼| 姑奶奶的老公叫什么| 五月二十日是什么日子| 身上痒什么原因| 碳14呼气试验阳性是什么意思| 挂了是什么意思| 通情达理是什么意思| 做梦烧纸钱什么意思| 卓诗尼牌子是什么档次| 女王是什么意思| 合盘是什么意思| 百香果和什么不能一起吃| 子宫内膜炎是什么原因造成的| 为什么镜子不能对着床| 开放式耳机是什么意思| 晚上五点是什么时辰| 爽文是什么意思| 黄体期出血是什么原因| 苯磺酸氨氯地平片什么时候吃最好| ubc是什么意思| 什么的月光| 西瓜有什么营养| 囊肿有什么症状| 30岁用什么眼霜比较好| 泡泡像什么| 鼠目寸光是什么生肖| 曹操是个什么样的人| a4纸可以做什么手工| 肚子咕噜咕噜响是什么原因| 胃轻度肠化是什么意思| 胆囊炎吃什么蔬菜好| 菠萝为什么要泡盐水| 大人发烧吃什么退烧药| 虚岁28岁属什么生肖| 盐茶是什么茶| 中国国酒是什么酒| 欣欣向荣是什么意思| 便士是什么意思| 7月28日什么星座| 空腹吃西红柿有什么危害| 荣耀是什么品牌| 蒲公英和什么相克致死| 药物制剂是干什么的| 肝脏在人体什么位置| 痘痘反复长是什么原因| 心思重是什么意思| 6月19是什么星座| 男方派去接亲要说什么| 一什么篮子| 空泡蝶鞍是什么病| 女人出虚汗失眠吃什么药| 思字属于五行属什么| 梨形心见于什么病| 验孕棒什么时候用| 桉字五行属什么| 大姨妈可以吃什么水果| 为什么月经不来| 吃什么长胎快| 桥本氏甲状腺炎吃什么药| 尿毒症是什么| 鹅蛋治什么妇科病| 阴道发白是什么原因| 星字五行属什么| 为什么腿老是抽筋| 蛇瓜是什么| 鼻甲肥大吃什么药最好| 我是小姨的什么人| 他达拉非是什么药| 腹腔肠系膜淋巴结是什么病| 包皮真菌感染用什么药| 庚字五行属什么| 蛇鼠一窝是什么生肖| 胆固醇高是什么症状| 紧急避孕药叫什么名字| 肤色不均匀是什么原因| 四肢抽搐口吐白沫是什么病| 枸杞泡水喝有什么功效| 心口疼是什么原因| 恩施有什么好玩的| 1956年是什么年| 双一流大学是什么意思| 落叶像什么| 嘴巴发苦是什么原因造成的| 软化血管吃什么药| 背后长疙瘩是什么原因| 脸色暗沉发黑什么原因| 身体素质是什么意思| 子宫增厚是什么原因| 隐匿是什么意思| 眼睛长麦粒肿用什么药| 避讳是什么意思| 身心健康是什么意思| 手脚麻木挂什么科| 肺部疼痛是什么原因| 金骏眉属于什么茶| 咖啡喝多了有什么副作用| 万兽之王是什么动物| 胳膊疼是什么原因| 什么东西能补肾壮阳| 牛骨煲汤搭配什么最好| 黄山四绝指的是什么| 电解质饮料有什么作用| 鼻头发黑是什么原因| 牙齿掉了一小块是什么原因| 石敢当是什么意思| 害喜是什么意思| 公务员属于什么行业| 龟头是什么意思| 蒲公英泡水喝有什么副作用| 肉瘤是什么样子图片| 74年大溪水命缺什么| 梦见给别人剪头发是什么意思| 外溢是什么意思| 江西什么最出名| 什么日什么秋| 想法是什么意思| 业火是什么意思| 梦到鞋子是什么意思| 穿什么衣服| 情人和小三的区别是什么| 8月23号是什么星座| 半夜饿了吃什么不长胖| 什么叫牙周炎| 咽喉炎吃什么药| 血压低吃什么药见效快| rts是什么意思| 梦到跟人吵架是什么意思| 头部ct能检查出什么| 吃什么降火| 男人吃什么可以补精| 夜来香是什么花| 酸菜鱼一般加什么配菜| 灵芝与什么相克| 入睡困难是什么原因引起的| 做b超可以检查出什么| 宫颈口在什么位置| 鼻咽炎有什么症状| 什么的辨认| 梦见下雨是什么意思| 空挡是什么意思| 狗可以吃什么| 属鼠男和什么属相最配| 多多益善什么意思| 得过且过是什么意思| pnh是什么病的简称| 河南为什么叫中原| 夏至吃什么传统食物| 头晕应该挂什么科| 什么地唱| 得艾滋病的前兆是什么| 梦见仙鹤是什么意思| 大姨妈是黑色是什么原因| 什么得当| 血糖高的病人吃什么| 风湿病是什么原因造成的| 梦到前女友征兆是什么| 石加乏念什么| 鼻子经常流鼻涕是什么原因| 人体最大的排毒器官是什么| 蓝色配什么色好看| 求人办事送什么礼物好| 什么的北风| 我炸了是什么意思| 狐臭和汗臭有什么区别| 耳朵嗡嗡响是什么原因| 输卵管堵塞什么症状| 窗口期什么意思| 裙子搭配什么鞋子| 什么食物可以降血糖| 嗓子疼吃什么消炎药| 天意是什么意思| 阳光灿烂是什么意思| 香客是什么意思| 人体由什么组成| 海鲜有什么| 肿瘤标志物高说明什么| 态生两靥之愁中靥指什么| 戌怎么读音是什么| 能吃是福是什么意思| 蔡英文是什么党派| 糖尿病患者适合吃什么水果| 电脑一体机什么牌子好| 柯南什么时候完结| 什么是桑黄| 西米是用什么做的| 脚气用什么药| 咳嗽有白痰吃什么药最好| 3月9日什么星座| 为什么小腿会抽筋| dh什么意思| 甲状腺彩超挂什么科| 万象更新是什么意思| ganni是什么牌子| 分泌性中耳炎吃什么药| 确立是什么意思| 立普妥是什么药| 癸水是什么意思| 念字五行属什么| 吃什么增强免疫力最快| 什么是礼仪| 醋泡洋葱有什么功效| 宫腔内钙化灶是什么意思| nsfw是什么意思| 维生素b6吃多了有什么副作用| 感统失调挂什么科| 积什么成什么| 天王星是什么颜色| 富士康是做什么的| 大便次数多是什么原因| 和衣是什么意思| 有加有减先算什么| 懵懂少年是什么意思| 经常吃土豆有什么好处| 为什么医院不用咳特灵| ecmo是什么| 请多指教是什么意思| 女人肾阴虚吃什么药| cra是什么| 为什么吹空调会咳嗽| 发膜和护发素有什么区别| 通风什么征兆| 狗怀孕有什么症状| 一什么千什么| 什么叫粳米| 家里养什么花最好| eos是什么意思| 下巴长痘是为什么| 肺部钙化是什么意思啊| 大腿骨叫什么骨| salsa什么意思| 榴莲为什么那么贵| prada是什么品牌| 肺部有阴影是什么原因| 梦见戴帽子是什么预兆| 阳起石是什么东西| 左眼跳财是什么意思| 肌电图是检查什么的| fw什么意思| 含字五行属什么| 神经内科看什么病的| 狗狗湿疹用什么药膏最有效| 吃炒黄豆有什么好处和坏处| 男人梦到掉牙什么预兆| 谷氨酸钠是什么添加剂| 小针刀是什么手术| 属兔配什么属相最好| 咆哮是什么意思| 低血糖看什么科室| 拖鞋什么材质的好| 四大美女指什么生肖| 海凉粉是什么做的| 片的第二笔是什么| 什么什么相什么的成语| 床上有横梁有什么害处| 培根是什么| 百度
Skip to content

面试官:说说 Node 文件查找的优先级以及 Require 方法的文件查找策略??#168

@huihuiha

Description

@huihuiha

一、模块规范

NodeJSCommonJS进行了支持和实现,让我们在开发node的过程中可以方便的进行模块化开发:

  • 在Node中每一个js文件都是一个单独的模块
  • 模块中包括CommonJS规范的核心变量:exports、module.exports、require
  • 通过上述变量进行模块化开发

而模块化的核心是导出与导入,在Node中通过exportsmodule.exports负责对模块中的内容进行导出,通过require函数导入其他模块(自定义模块、系统模块、第三方库模块)中的内容

二、查找策略

require方法接收一下几种参数的传递:

  • 原生模块:http、fs、path等
  • 相对路径的文件模块:./mod或../mod
  • 绝对路径的文件模块:/pathtomodule/mod
  • 目录作为模块:./dirname
  • 非原生模块的文件模块:mod

require参数较为简单,但是内部的加载却是十分复杂的,其加载优先级也各自不同,如下图:

从上图可以看见,文件模块存在缓存区,寻找模块路径的时候都会优先从缓存中加载已经存在的模块

原生模块

而像原生模块这些,通过require 方法在解析文件名之后,优先检查模块是否在原生模块列表中,如果在则从原生模块中加载

绝对路径、相对路径

如果require绝对路径的文件,则直接查找对应的路径,速度最快

相对路径的模块则相对于当前调用require的文件去查找

如果按确切的文件名没有找到模块,则 NodeJs 会尝试带上 .js.json .node 拓展名再加载

目录作为模块

默认情况是根据根目录中package.json文件的main来指定目录模块,如:

{ "name" : "some-library",
  "main" : "main.js" }

如果这是在./some-library node_modules目录中,则 require('./some-library') 会试图加载 ./some-library/main.js

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

非原生模块

在每个文件中都存在module.paths,表示模块的搜索路径,require就是根据其来寻找文件

window下输出如下:

[ 'c:\\nodejs\\node_modules',
'c:\\node_modules' ]

可以看出module path的生成规则为:从当前文件目录开始查找node_modules目录;然后依次进入父目录,查找父目录下的node_modules目录,依次迭代,直到根目录下的node_modules目录

当都找不到的时候,则会从系统NODE_PATH环境变量查找

举个例子:

如果在/home/ry/projects/foo.js文件里调用了 require('bar.js'),则 Node.js 会按以下顺序查找:

  • /home/ry/projects/node_modules/bar.js
  • /home/ry/node_modules/bar.js
  • /home/node_modules/bar.js
  • /node_modules/bar.js

这使得程序本地化它们的依赖,避免它们产生冲突

三、总结

通过上面模块的文件查找策略之后,总结下文件查找的优先级:

  • 缓存的模块优先级最高

  • 如果是内置模块,则直接返回,优先级仅次缓存的模块

  • 如果是绝对路径 / 开头,则从根目录找

  • 如果是相对路径 ./开头,则从当前require文件相对位置找

  • 如果文件没有携带后缀,先从js、json、node按顺序查找

  • 如果是目录,则根据 package.json的main属性值决定目录下入口文件,默认情况为 index.js

  • 如果文件为第三方模块,则会引入 node_modules 文件,如果不在当前仓库文件中,则自动从上级递归查找,直到根目录

参考文献

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      肛门瘙痒是什么问题 利大于弊是什么意思 男人胸前有痣代表什么意思 血清铁蛋白低说明什么 whatsapp是什么软件
      梦到拔牙是什么预兆 碳14是检查什么的 结节低回声是什么意思 琼玖是什么意思 丙二醇是什么
      血糖高应该吃什么水果 印泥干了用什么稀释 胆红素高是什么原因引起的 尿特别多是什么原因 车震是什么
      竹代表什么生肖 耳后淋巴结肿大吃什么消炎药 流浓黄鼻涕是什么原因 湿热会引起什么症状 rf是什么意思
      男人下面有异味什么原因inbungee.com 琏是什么意思hcv8jop3ns3r.cn 弱视什么意思luyiluode.com 6月28什么星座beikeqingting.com 喝酒前吃什么不容易醉又不伤胃jasonfriends.com
      安陵容为什么叫安小鸟travellingsim.com p波高尖代表什么hcv8jop6ns4r.cn 224是什么星座hcv7jop4ns8r.cn 自然是什么意思hcv8jop6ns1r.cn 给孩子测骨龄应该挂什么科hcv9jop4ns8r.cn
      断肠草长什么样hcv9jop6ns5r.cn 潮喷是什么hcv9jop7ns2r.cn 618是什么日子hcv9jop4ns5r.cn 网线长什么样hcv9jop6ns7r.cn 甲状腺结节吃什么盐hcv9jop6ns4r.cn
      处女膜破了有什么影响gangsutong.com Fish什么意思hcv8jop2ns5r.cn 头发长的快是什么原因hcv7jop6ns5r.cn 散光轴位是什么hcv9jop8ns3r.cn 丙氨酸氨基转移酶是什么hcv7jop6ns1r.cn
      百度