_node中的require
node无法同时执行多个脚本文件
1. require
1.1 require是一个方法,作用就是用来加载模块
在Node中模块有三种:(核心模块,第三方模块,自己写的模块)
1.核心模块(fs,http,os,url,path)
var fs = require('fs')
var http = require('http')
2.自己写的文件模块(相对路径必须加 ./)


1.2 在node中没有全局作用域只有模块作用域
(外部访问不到内部,内部也访问不到外部)
a.js和b.js中的foo不一样
//a.js
console.log('a start');
var foo = 'aaa'
require('./b.js')
console.log(foo);
console.log('a end');
//b.js
console.log('b.js已经被执行了');
var foo = 'bbb'
console.log(foo);

a.js中的函数在b.js中不能使用
//a.js
console.log('a start');
function add(x, y) {
console.log(x, y);
}
var foo = 'aaa'
require('./b.js')
console.log(foo);
console.log('a end');
//b.js
console.log('b.js已经被执行了');
add(1, 2)
var foo = 'bbb'
console.log(foo);

2.如何实现模块与模块之间通信
require方法有两个作用:
1.加载文件模块并执行里面的代码
2.拿到被加载文件模块到处的接口对象
在每个文件模块中都提供了一个对象exports
exports默认是一个空对象
//a.js
//用ret来接收b中的对象exports
var ret = require('./b.js')
console.log(ret.foo);
console.log(ret.add(1, 2));
//b.js
var foo = 'bbb'
//输出一个空对象
// console.log(exports);
exports.foo = foo
exports.add = function (x, y) {
return (x + y)
}

3.优先从缓存加载
//main.js
require('./a')
require('./b') //只是为了得到接口对象
//a.js
console.log('a被加载执行了');
require('./b')
//b.js
console.log('b被执行了');

由于在a中已经加载过了b,所以不会重复加载,可以拿到其中的接口对象,但是不会重复执行里面的代码,这样做的目的是为了避免重复加载提高模块加载效率

4.判断模块标识
4.1路径形式模块:文件后缀可以省略,一般用 . /和.. /
4.2核心模块:已经被编译到了二进制文件中,使用名字来加载
4.3第三方模块:凡是第三方模块都必须通过npm下载,通过require(’‘包名’)的方式来进行加载才可以使用,第三方包和核心模块的名字不能一样
先找到当前文件所处目录中的node_modules目录
然后找node_modules/art-template
再去找node_modules/art-template/package.json文件
再去找node_modules/art-template/package.json文件中的main属性
main属性记录了art-template入口模块
var template = require('art-template')



如果找不到会一直往上一级查找,如果知道当前磁盘根目录还找不到,最后报错:can not find module xxx
本文详细介绍了Node.js中的require方法,包括其在加载核心模块、自定义模块和第三方模块时的作用。强调了模块作用域的概念,以及如何通过exports实现模块间通信。还讨论了模块缓存机制,避免了重复加载,提高了效率。此外,讲解了模块标识的判断规则,包括路径、核心模块和第三方模块的加载方式。

被折叠的 条评论
为什么被折叠?



