模块化

96 阅读4分钟

什么是模块化

一个js文件就是一个模块,每个模块都是一个独立的作用域。

把一系列相类似功能的封装到一个模块中然后对外提供一些方法供其他模块使用就是模块化。

全局函数require

node.js环境中的全局函数:require()可以导入模块,就可以在当前模块中加载和使用别的模块,传入一个模块名,会返回一个模块导出对象。

引入前端的js文件用import,后端运行时引入第三方js文件就用require() 也可以用import需要加载器(es6语法)

import和require区别

1.require对应导出的方法是module.exports,import对应的方法是export default/export

2、require 是CommonJs的语法,import 是 ES6 的语法标准。

3、require引入是运行时才会加载模块里的所有方法,没有运行时就不会加载可以绑定在事件中或者在函数中引用是动态加载的,import是编译的时候调用(静态加载),必须放在文件的最开始只能写在代码顶部,不能写在函数中。

if(条件){require()};//只有当条件成立才会执行if语句中的require()

node.js的3种模块

内置模块

内置模块也称核心模块,node.js安装时自己就装好了的模块。由node.js本身提供,不需要单独安装(npm),可直接引入使用。

fs:文件操作模块

http:网络操作模块

path:路径操作模块

url: 解析地址的模块

querystring: 解析参数字符串的模块

第三方模块

不是node.js提供由第三方(社区或个人)提供,需要通过npm安装后才能引入使用。

自定义模块

由我们自己创建,自己所写的js文件就是一个模块,引入时需要用相对路径。

模块的引入

通过require()来引入模块

内置模块可以直接引入,比如:require("fs")

如果是第三方模块,需要先使用npm进行下载

如果是自定义模块,需要加上相对路径./或者../,可以省略.js后缀建议加上后缀。

模块可以被多次加载,但是只会在第一次加载

模块导出

在模块的内部,module变量代表的就是当前模块,它的exports属性就是对外的接口,在引入某个模块后加载这个模块,加载的就是module.exports属性,这个属性指向一个空的对象。

image.png

如何寻找引入的模块

require("fs1"):

1.先基于当前文件所在的文件夹中找node_modules文件夹,如果找到node_modules文件夹则去node_modules文件夹中找fs1文件夹,如果找到fs1文件夹则去找fs1文件夹中的package.json文件,如果找到package.json文件则去找package.json文件中的main字段,然后根据main字段对应的文件路径就可以引入。

如果找到fs1文件夹之后,发现没有package.json或者有package.json没有main字段或者 有main字段,但是指向的路径不存在。则node会默认去看一下fs1文件夹中有没有 index.js index.node index.json 文件package.json文件中的main字段,然后根据main字段对应的文件路径就可以引入。

2.如果当前文件所在的文件夹中没有node_modules文件夹,就去node的安装包中的全局安装路径找node_modules文件夹,找到node_modules文件夹后,同理找找fs1文件夹然后找fs1文件夹中的package.json文件再找。

image.png

一般常用的插件都安装在此路径。或者安装第三方模块时(npm i xxx -g)就选择安装在这个全局路径。安装第三方模块时(npm i xxx -save或者npm i xxx)这样就安装在当前运行的js文件所在的文件夹中。

全局安装路径就是在安装node.js运行环境时配置的全局安装路径即npm config set prefix "X:\node\node_global"

3.如果node的安装包中的全局安装路径没有node_modules文件夹就去核心库,同理最后根据main字段对应的文件路径就可以引入。

核心库就是安装node.js后自动创建的文件夹

image.png

内置模块都安装在此路径。

4.如果最后核心库还找不到,最后报错:Can not find module "xxx"