为什么要学习模块化?
首先要明确:模块化:一个js文件中可以引入另一个js文件的数据。
这个特点是很基础的要求,只要是编程语言都有。而js2015年之前没有;js没有(疼点:多个js都放在一个html文件,而不用相互引用),2015年出了ES6。在语法层面就支持模块化,但是浏览器不支持,所有前面学习传统开发时,还是多个js都放在一个html文件
浏览器不支持,可以:
1.先用开发工具(wepack)搭建一个支持模块化的环境
2.在这个环境中写模块化代码
3.用工具打包打包代码,然后在浏览器中运行
nodeJS和浏览器?
相同点:都是JS代码的运行环境
nodeJS环境是支持模块化的
3.nodejs中的模块化
导出:module.exports ,exports
导入: 自定义模块: const xxx=require(模块文件中的相对位置)
内置模块 :const xxx=require(模块的名字)
第三方模块:const xxx=require(模块的名字)
1. 概念:模块化是指解决一个复杂问题时,自顶向下逐层把系统划分成若干模块的过程,对于整个系统来说,模块是可组合,分解和跟换的单元。
2.编程领域中的模块化
编程领域中的模块化,是把一个大文件拆成独立并互相依赖的多个小模块
3.模块的三大类
1.内置模块
由于 Node.js官方提供
2.自定义模块
自己创建的js文件
3.第三方模块
要去官网进行下载
4.require() 函数加载模块
1. 作用:使用require()方法加载其它模块时,会执行被加载模块中的代码
注意:在使用require加载用户自定义模块期间,可以省 .js的后缀名
// yourModule.js
exports = 1
//index.js
const yourModule = require('./yourModule');
console.log(yourModule)
返回的是一个空的对象
// yourModule.js
exports = {a : 1 };
//index.js
const yourModule = require('./yourModule');
console.log(yourModule)
返回的也是一个空的对象
5. 模块作用域
1. 定义:和函数作用域类似,在自定义模块中定义的变量,方法等成员,只能在当前模块内被访问,叫做模块作用域
2.好处:防止了全局变量的污染的问题
3. 例子:变量污染,一个html,引入两个js文件导入 一个js,导入两个js文件
6..module对象
1.概念:
在每一个.js自定义模块都有一个module对象,它里面存储了和当前模块有关的信息。
在自定义模块中,可以使用module.exports对象,将模块内的成员共享出去,供外界使用。
外界用require()方法导入自定义模块时,得到的就是module.exports所指向的对象。
module.exports 默认指向的是一个空的对象。
2.注意点:
使用require()方法导入模块时,导入的结果,永远以module.exports指向的对象为准
3.exports对象
概念: exports和module.exports 指向的是同一个对象
注意点: require()模块最终的指向是module.exports
为了防止混乱,建议大家不要在同一个模块中使用exports 和 module.exports
module.exports 使用的比较多 一般情况下, 使用 exports 看懂别人的代码
7.CommonJS规定:
定义:Node.js遵循了CommonJS模块化规范,CommonJS规定了模块的特性和各模块之间如何相互依赖
CommonJS规定:
1.每个模块内部,module变量代表当前模块的module.exports属性,require()方法用于加载模块
2.module变量是一个对象,它的exports属性(即module.exports)是对外的接口
3.加载某个模块,其实是加载该模块的module.exports
8.关于包
1.定义:Node.js中的第三方模块又叫包
2.包是由第三方个人或团队开发出来的,免费供所有人使用
3.为什么需要包?
由于Node.js的内置模块提供了一些底层的APi,导致在基于内置模块进行项目开发时
包是基于内置模块封装出来的,极大地提高了开发效率
4.包的搜索和下载
搜索包:
下载包:
npm -v 查看自己电脑上的所安装npm的版本号
5.在项目中的安装包
语法:
1.npm install 包的完整名称 简写 npm i 完整的名称
列如: npm i moment
2.案例
// 1.导入需要的包
const moment = require('moment')
const dt = moment().format('YYYY-MM-DD HH:mm:ss');
console.log(dt); (网站不在维护)
const moment = require('dayjs')
const dt = moment().format('YYYY-MM-DD HH:mm:ss');
console.log(dt)的使用;(dayjs)
6.下载指定版本的包
语法: npm i moment @ 版本号
第1位数字:大版本
第2位数字:功能版本
第3位数字:Bug修复版本
版本号提示的规则: 只要前面的版本号增长了,则后面的版本号归零
7.安装包 ,删除包
1.安装指定文件的包
npm i 包的名字
2. 安装所有的包
npm i
3.删除包
-
命令:npm uninstall 命令来卸载指定的包
-
npm uninstall命令执行完成后,会把卸载的包,自动从package.json的dependencies中 移除掉。
3.devDependencies 在项目开发阶段会用到,在项目上线不会用到
格式: npm i 包名 -D
9.node_modules的文件夹 和package-lock.json的配置文件
作用:
node_modules的文件夹 用来存放所有安装到项目中的包,require()导入第三方包时,就是从这个目录中查找并加载包
package-lock.json 配置文件用来记录 node_modules目录的每一个包的下载信息,列如包的名字,版本号,下载地址
10.包管理配置文件(package.json)
定义: npm规定,在项目根目录中,必须提供一个叫package.jsond的包管理配置文件,用来记录与项目相关的一些配置
今后在项目开发中,一定要把node _modules 文件夹,添加到.gitgnore 忽去文件
npm init -y 可以在项目中创建一个package.json文件
1.注意事项 路径不能包含中文和空格
2.npm init -y默认所有的选项 ,可以进行修改 (没有加y需要一个个进行配置)
3.dependcies节点
11.如何解决下载包慢的问题
淘宝NPM镜像服务器
1.每隔一段时间,自动把npm 官方服务器的包同步到国内
官方服务器的包同步到国内
-
下包的镜像源,指的就是下包的服务器地址
指令
查看当前的下包镜像源
npm config ger registrt
2.将下包的镜像源切换为淘宝镜像源
npm config ger set registrt=http://registry.npm.taobao.org/
检查镜像源是否下载成功
npm config get registry
为了更方便的切换下包的镜像源,可以安装nrm这个小工具,利用nrm提供的终端命令,可以快速查看和切换下包的镜像源
通过npm包管理器,将nrm安装为全局可用的工具
npm i nrm -g
查看所有可用的镜像源
nrm ls
将下包的镜像源切换为taobao 镜像
nrm use taobao