以下皆为拉勾教育课件内笔记
自定义模块
自定义模块就是工程师自己写的一段代码。可以是一个单独的 JS 文件,也可以是一个目录。
在模块中,只有导出(exports)的属性或方法才能被外部使用,没有导出的属性或方法是模块的私有方法,只能在模块内部使用。外部使用自定义模块同样使用 require() 导入。
模块的声明:
// circle.js 我们声明一个模块 circle,模块中有两个方法,分别求圆的面积和周长。
const PI = 3.14
// 圆的周长
const perimeter = (r) => {
return 2 * PI * r
}
// 圆的面积
function area (r) {
return PI * Math.pow(r, 2)
}
// 模块内容导出后,才能被外部调用
module.exports = {
perimeter,
area
}
module 变量代表当前模块。这个变量是一个对象,它的exports属性(即module.exports)是对外的接口。加载某个模块,其实是加载该模块的module.exports属性。
以下是 console.log(module) 的代码示例:
模块的使用:
// 在 app.js 中引入模块
// 引入模块时,需要写引入路径,否则 require('circle') 会报错
const circle = require('./circle')
// 调用模块中的属性或方法
const r = 10
const p = circle.perimeter(r)
const a = circle.area(r)
console.log(`直径为 ${r} 的圆的周长是:` + p)
console.log(`直径为 ${r} 的圆的面积是:` + a)
注意:引入自定义模块时,需要带有引入路径,否则,会报错
模块分类
我们可以根据文件的组织方式,将模块分成文件模块和目录模块。
不同类型的模块,引入方式不同,其加载逻辑也不相同,一共有四种情况:
- 以路径开头的文件模块
- 不以路径开头的文件模块
- 以路径开头的目录模块
-
不以路径开头的目录模块
package.json
package.json 是目录模块的描述文件。
目录中可能有多个 js 文件,引入模块时,到底引入哪一个文件呢?
默认是 index.js。如果你希望默认引入的不是 index.js,则可以通过 package.json 中的 main 字段指定
# package.json
{
"main": "app.js"
}
node_modules
如果引入目录模块时,没有指明引入路径。则默认加载当前目录下 node_modules 下的目录模块。
如果当前目录下没有 node_modules, 会到上一级目录(../)继续寻找,直到顶层目录。