模块化
1、模块化规范
AMD 国外浏览器端 代表requirejs
CMD 国内浏览器端 代表seajs
Commonjs 服务器端 代表nodejs
es6大一统 浏览器和服务器端统一规范
2、分类
1) 内置模块 Node自己提供, 比如: fs, path, http ...
2) 自定义模块 用户自己创建的.js文件, 都是自定义模块
3) 第三方模块 由第三方开发出来的模块, 发布到npm网站上, 使用前需要先下载
// 1) 引入内置模块
const fs = require('fs')
// 2) 引入三方模块
// 必须先下载
const mime = require('mime')
// 3) 自定义模块
// 加载自定义模块, 需要加上'./, 可以省略后缀
const other = require('./other')
const a = require('./js/a')
3、模块导出
(1)模块作用域
模块与模块有作用域
model.exports={
要导出的成员
}
(2)步骤
1)、定义模块
const stuName = '石玉'
const stuFriends = ['刘德华', '周润发']
const logMsg = ()=>{
console.log(`姓名: ${stuName}, 他的朋友们: ${stuFriends}`)
}
// 2. 暴露给外部使用
module.exports = {
stuName,
stuFriends,
logMsg
}
2)、引用模块
// 1. 引入自定义模块
const other = require('./other')
// 2. 使用模块other中暴露出来的属性和方法
// console.log(other)
other.logMsg()
(3)补全机制
原文件=》(加后缀)js=》json=》node+》报错
commonjs底层
函数内部有5个形参, 分别是:
exports: 指向module.exports, 用于对外暴露内容
require: 在当前函数中用于引入外部模块
module: 代表当前模块
__filename: 当前模块对应的绝对路径
__dirname: 当前模块所在文件夹的绝对路径
面试题:
exports和module.exports的区别?
相同点:
都是由于对外暴露模块中的成员
不同点:
1) module.exports可以直接赋值一个对象, 对象内部包含了要暴露的成员
2) exports不行, 必须一个个的添加需要暴露的属性和方法
const num1 = 100
const num2 = 200
const fn = ()=>{
console.log('------')
}
// module.exports = {
// num1,
// num2,
// fn
// }
exports = {
num1,
num2,
fn
}
// module.exports.num1 = 100
// module.exports.num2 = 200
// module.exports.fn = ()=>{
// console.log('------')
// }
// exports.num1 = 100
// exports.num2 = 200
// exports.fn = ()=>{
// console.log('-----')
// }
npm 第三方模块的管理工具
1、命令
npm init 初始化
npm i 模块名 安装
npm un 模块名 卸载
只能在的当前文件夹和子级文件夹使用
指定版本号安装
npm i axios@0.23.0
全局安装
npm i 模块名 -g
上传可以把node_model文件夹删掉,但必须保留package.json,因为要依赖的包 npm i
镜像下载
nrm