目录
3.2.4exports和module.exports的使用误区
1.node.js中模块的分类
Node.js 中根据模块来源的不同,将模块分为了3大类,分别是:
- 内置模块(内置模块是由Node.js 官方提供的,例如fs、path、http等)
- 自定义模块(用户创建的每个.js 文件,都是自定义模块)
- 第三方模块(由第三方开发出来的模块,并非官方提供的内置模块,也不是用户创建的自定义模块,使用前需要先下载)
2.模块的加载
使用强大的 require()方法,可以加载需要的内置模块、用户自定义模块、第三方模块进行使用。代码如下:
注意:使用require()方法加载其它模块时,会执行被加载模块中的代码。
// 1加载内置
const fs = require('fs')
// 2加载自定义(可以省略.js的后缀名)
const custom = require('./06m1.js')
console.log(custom)
// 3加载第三方
const thirdPart = require('moment')
3 .Node.js 中的模块作用域
3.1什么是模块作用域
和函数作用域类似,在自定义模块中定义的变量、方法等成员,只能在当前模块内被访问,这种模块级别的访问限制,叫做模块作用域。
好处:防止的全局变量污染的问题
浏览器中只有函数作用域,没有模块作用域
最终会输出ls
3.2向外共享模块作用域中的成员
3.2.1module对象
在每个.js自定义模块中都有一个module对象,它里面存储了和当前模块有关的信息。
3.2.2module.exports对象
在自定义模块中,可以使用module.exports对象,将模块内的成员共享出去,供外界使用。外界用require()方法导入自定义模块时,得到的就是module.exports所指向的对象。
3.2.3exports 对象
由于module.exports单词写起来比较复杂,为了简化向外共享成员的代码,Node提供了exports对象。默认情况下,exports和module.exports指向同一个对象。最终共享的结果,还是以module.exports 指向的对象为准。
3.2.4exports和module.exports的使用误区
使用require()方法导入模块时,导入的结果,永远以module.exports指向的对象为准。
注意:为了防止混乱,建议大家不要在同一个模块中同时使用exports和module.exports
3.3 Node.js 中的模块化规范
Nodejs 遵循了CommonJS模块化规范,CommonJS规定了模块的特性和各模块之间如何相互依赖。
CommonJS规定:
- 每个模块内部,module变量代表当前模块。
- module变量是一个对象,它的exports属性(即module.exports)是对外的接口。
- 加载某个模块,其实是加载该模块的 module.exports属性。require)方法用于加载模块。
4.npm与包
终端的一些命令:
- npm -v查看自己电脑上所安装的npm包管理工具的版本号
- npm i /install 包的名称导入所需要的包
- npm i /install 包的名称@指定的版本号安装指定版本的包
- npm init -y快速创建package.json
- npm install/i一次性安装所有包
- npm uninstall 包名卸载指定的包
- npm i /install 包的名称 -D安装指定包,将包记录到devDependencies节点中
4.1概念
Node.js 中的第三方模块又叫做包。包是由第三方个人或团队开发出来的,免费供所有人使用。由于Node.js 的内置模块仅提供了一些底层的API,导致在基于内置模块进行项目开发的时,效率很低。包是基于内置模块封装出来的,提供了更高级、更方便的APl,极大的提高了开发效率。
搜索包: 从https://www.npmjs.com/网站上搜索自己所需要的包
下载包:从https://registry.npmjs.org/服务器上下载自己需要的包
npm, Inc.公司提供了一个包管理工具,这个包管理工具的名字叫做Node Package Manager (简称npm包管理工具),这个包管理工具随着Node.js的安装包一起被安装到了用户的电脑上。我们可以使用这个包管理工具,从https://reqistry.npmjs.org/服务器把需要的包下载到本地使用。在终端中执行npm -v命令,来查看自己电脑上所安装的npm包管理工具的版本号。
4.2npm初体验
格式化时间的传统做法
- 创建格式化时间的自定义模块
- 定义格式化时间的方法
- 创建补零函数
- 从自定义模块中导出格式化时间的函数
- 导入格式化时间的自定义模块
- 调用格式化时间的函数
格式化时间的高级做法
- 使用npm包管理工具,在项目中安装格式化时间的
- 使用require()导入格式化时间的包
- 参考moment的官方API文档对时间进行格式化
代码实现:
// 1导入所需要的包 用[npm i moment(包的名称)] 导入之后可以去官方文档中查看具体的教程 const moment = require('moment') // 使用moment()可以获得当前时间 const time = moment() console.log(time) // 使用format()可以对时间进行对应的格式化 const dt = moment().format('YYYY-MM_DD HH:mm:ss') console.log(dt)
初次装包后多了哪些文件
初次装包完成后,在项目文件夹下多一个叫做node modules 的文件夹(用来存放所有已安装到项目中的包。require()导入第三方包时,就是从这个目录中查找并加载包)和package-lock.json的配置文件(用来记录node modules目录下的每一个包的下载信息,例如包的名字、版本号、下载地址)
4.3包管理配置文件
4.3.1package.json
4.3.2多人协作问题
遇到的问题:第三方包的体积过大,不方便团队成员之间共亨项目源代码。
4.3.3快速创建package.json
注意:
- 上述命令只能在英文的目录下成功运行!所以,项目文件夹的名称一定要使用英文命名,不要使用中文,不能出现空格
- 运行npm install命令安装包的时候,npm包管理工具会自动把包的名称和版本号,记录到package.json 中。
4.3.4dependencies 节点
package.json文件中,有一个dependencies 节点,专门用来记录您使用npm install命令安装了哪些包。
4.3.5一次性安装所有包
当我们拿到一个剔除了node modules 的项目之后,需要先把所有的包下载到项目中,才能将项目运行起来。可以运行npm install命令(或npm i)一次性安装所有的依赖包:
4.3.6devDependencies节点
如果某些包只在项目开发阶段会用到,在项目上线之后不会用到,则建议把这些包记录到devDependencies节点中。与之对应的,如果某些包在开发和项目上线之后都需要用到,则建议把这些包记录到dependencies节点中。
4.4解决包下载慢问题
4.4.1包下载慢的原因
4.4.2切换npm下包的服务器地址
为了更方便的切换下包的镜像源,我们可以安装nrm这个小工具,利用nrm提供的终端命令,可以快速查看和切换下包的镜像源。