require标识符分析

摘要:
需要('./a')//首选从缓存加载//由于b已加载到a中,因此不会重复加载//可以获得接口对象,但其中的代码不会重复//这样做的目的是避免重复加载并提高模块加载效率。varfn=require('./b')console.log(fn)如果它是非路径形式的模块,请以路径形式标识该模块:/不能省略当前目录/不能省略上层目录/xxx几乎不需要d:/a/foo.j
require('./a')

// 优先从缓存加载
// 由于 在 a 中已经加载过 b 了
// 所以这里不会重复加载
// 可以拿到其中的接口对象,但是不会重复执行里面的代码
// 这样做的目的是为了避免重复加载,提高模块加载效率
var fn = require('./b')

console.log(fn)
 
 
如果是非路径形式的模块标识
路径形式的模块:
./ 当前目录,不可省略
../ 上一级目录,不可省略
/xxx 几乎不用
d:/a/foo.js 几乎不用
首位的 / 在这里表示的是当前文件模块所属磁盘根路径
.js 后缀名可以省略
require('./foo.js')

核心模块的本质也是文件
核心模块文件已经被编译到了二进制文件中了,我们只需要按照名字来加载就可以了
require('fs')
require('http')

第三方模块
凡是第三方模块都必须通过 npm 来下载
使用的时候就可以通过 require('包名') 的方式来进行加载才可以使用
不可能有任何一个第三方包和核心模块的名字是一样的
既不是核心模块、也不是路径形式的模块
先找到当前文件所处目录中的 node_modules 目录
node_modules/art-template
node_modules/art-template/package.json 文件
node_modules/art-template/package.json 文件中的 main 属性
main 属性中就记录了 art-template 的入口模块
然后加载使用这个第三方包
实际上最终加载的还是文件

如果 package.json 文件不存在或者 main 指定的入口模块是也没有
则 node 会自动找该目录下的 index.js
也就是说 index.js 会作为一个默认备选项
 
如果以上所有任何一个条件都不成立,则会进入上一级目录中的 node_modules 目录查找
如果上一级还没有,则继续往上上一级查找
。。。
如果直到当前磁盘根目录还找不到,最后报错:
can not find module xxx
var template = require('art-template')

注意:我们一个项目有且只有一个 node_modules,放在项目根目录中,这样的话项目中所有的子目录中的代码都可以加载到第三方包
不会出现有多个 node_modules
模块查找机制
优先从缓存加载
核心模块
路径形式的文件模块
第三方模块
node_modules/art-template/
node_modules/art-template/package.json
node_modules/art-template/package.json main
index.js 备选项
进入上一级目录找 node_modules
按照这个规则依次往上找,直到磁盘根目录还找不到,最后报错:Can not find moudle xxx
一个项目有且仅有一个 node_modules 而且是存放到项目的根目录

require('a')

免责声明:文章转载自《require标识符分析》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇solr搜索之搜索精度问题我已经尽力了!!!shell重定向(大于号,小于号,左右,2>&1,&)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

NodeJS + Socket.IO 最终版

服务器端 //socket.io var app = require("express")(); var http = require("http").Server(app); var io = require("socket.io")(http); //couchbase var couchbase = require("couchbase"); va...

node多版本切换

一、【NVM】 NVM (Node Version Manager): Nodejs的版本管理工具早期的nvw只支持Linux 和Mac,而window用户较多使用的是nvmw。但最近由于重装系统偶然发现已有更新nvm支持window,而且快捷方便,不需要设置环境变量。 二、【步骤】 如果已经安装过node版本,请先自行卸载,这一步很重要!!! 卸载现有n...

nodejs 和 js

JavaScript组成:ECMAScript(定义这门语言的基础,比如语法、数据类型、结构以及一些内置对象等)、DOM(基于ECMASCRIPT,扩展出来的用于操作页面元素的方法)、BOM(基于ECMASCRIPT,扩展出来的用于操作浏览器的一些方法)。 NodeJS是以ECMASCRIPT为基础,然后在这个基础上扩展出来的一些操作其他东西(即操作非浏览...

Linux--安装node.js

前戏 node.js是前端开发者必须会使用,它里面的npm可以安装前端所使用的一些包。现在的node.js已经内置了npm,所以我们只需要安装node.js就可以了,我这里以安装node.js8.11.1为例 安装node.js 1.下载node.js 8.11.1包 wget https://nodejs.org/dist/v8.11.1/node-v8...

requireJS的使用_API(1)

之前有介绍过requireJS(模块化开发),可以看看 ,但是不详细,所以今天参考官网来详细介绍一下: 1.加载js文件: RequireJS的目标是鼓励代码的模块化,它使用了不同于传统<script>标签的脚本加载步骤。可以用它来加速、优化代码,但其主要目的还是为了代码的模块化。它鼓励在使用脚本时以module ID替代URL地址。 Requ...

Nuxt项目支持import写法的最新解决方案

最近在看Nuxt开发vue项目的视频,视频中讲到Nuxt项目不支持es6的import写法。并提供了解决方案: 1.在package.json中添加我标红的部分: "scripts": { "dev": "cross-env NODE_ENV=development nodemon server/index.js --watch server...