当前位置: 首页 > 后端技术 > Node.js

node系列:2.模块化

时间:2023-04-03 14:25:02 Node.js

1.写的比较早为了统一Javascript在浏览器外的实现,诞生了CommonJS。CommonJS试图定义一套通用应用程序使用的API,以填补过度简化的JavaScript标准库的不足。CommonJS规范包括模块、包、系统、控制台、文件系统、单元测试等。Node.js是目前最流行的CommonJS规范实现。随着CommonJS规范的更新,Node.js也在跟进,但是Node.js并没有完全遵循CommonJS规范。这是所有规范制定者都会遇到的尴尬局面,因为规范的制定总是滞后于技术的发展。2.Node模块化模块(Module)和包(Package)是Node.js最重要的支柱。仅用一个文件是不可能开发出一定规模的程序的。通常,需要对各种功能进行拆分、封装,然后组合,模块就是为了实现这种做法而诞生的。在浏览器JavaScript中,脚本模块的拆分和组合通常使用HTML脚本标签来实现。Node.js提供了调用其他模块的require函数,而模块是以文件为基础的,换句话说,每个文件就是一个模块,机制非常简单。模块类型Nodejs模块可以分为两类,一类是核心模块,一类是文件模块。核心模块由nodejs官方提供。node进程启动时,会直接加载一些核心模块到内存中,所以我们可以直接通过require导入这部分核心模块。如http模块、url模块、fs模块等。consthttp=require('http');//内置模块直接引用consthost='127.0.0.1';常量端口=3000;constserver=http.createServer((req,res)=>{res.statusCode=200;res.end('test1');})server.listen(port,host,()=>{console.log(`服务器运行在http://${host}:${port}/`)})文件模块在运行时动态加载,需要完整的路径解析、文件定位、编译和执行过程。速度比核心模块稍慢,但是用的多。加载文件模块有两种方式,一种是通过路径加载,另一种是搜索node_modules文件夹。通过路径加载方式//custom_module文件夹下的tools文件functioncalculate(num){returnnum*2}functiongetUrl(domain){return`${domain}/wanwan0306`}module.exports={calculate,getUrl}//app.jsconsthttp=require('http');const{calculate,getUrl}=require('./custom_module/tools');//通过路径导入consthost='127.0.0.1';常量端口=3100;constserver=http.createServer((req,res)=>{constnum=calculate(20);consturl=getUrl('https');res.statusCode=200;res.end(`${num}-${url}-test2`);})server.listen(port,host,()=>{console.log(`serverrunningathttp://${host}:${port}/`)})node_modules文件夹加载方式//node_modules文件夹下的tools文件functioncalculate(num){returnnum*2}functiongetUrl(domain){return`${domain}/wanwan0306`}module.exports={calculate,getUrl}//app.jsconsthttp=require('http');const{calculate,getUrl}=require('tools');//node_modulesconsthost='127.0.0.1';常量端口=3200;常量服务器=http.createServer((req,res)=>{constnum=calculate(20);consturl=getUrl('https');res.statusCode=200;res.end(`${num}-${url}-test3`);})server.listen(port,host,()=>{console.log(`服务器运行在http://${host}:${port}/`)})加载规则1.如果require参数字符如果字符串以“/”开头,表示加载位于绝对路径下的模块文件。例如,require('/future/Demo/NodeJs/2.modular/custom_module/tools.js')将加载/future/Demo/NodeJs/2。模块化/custom_module/tools.js;2、如果require参数以“./”或者“../”开头,那么模块是通过相对路径来查找的,这是最常见的,比如前面的例子中我们使用了require('./custom_module/工具')加载;3、如果require参数不是以“./”或“../”开头,并且该模块不是核心模块,那么需要通过寻找node_modules来加载模块(通常是加载使用npm获取的包这样);例如:script/future/Demo/NodeJs/2.modular/app3.js执行了require('tools.js')命令,Node会依次搜索以下文件/usr/local/lib/node/tools.js/未来/演示/NodeJs/2。模块化/node_modules/tools.js/future/Demo/NodeJs/node_modules/tools.js/future/node_modules/tools.js/node_modules/tools.js4。如果指定的模块文件没有后缀,Node会尝试在文件名后加上.js、.json、.node,然后搜索..js文件将被解析为文本格式的JavaScript脚本文件,.json文件将被解析为JSON格式的文本文件,.node文件将被解析为编译后的二进制文件;注意:核心模块具有最高的加载优先级,换句话说,如果有与其名称冲突的模块,Node.js将始终加载核心模块。加载和缓存Node.js模块不会重复加载,因为Node.js通过文件名缓存了所有加载的文件模块,所以以后访问时不会重新加载。注意Node.js是根据实际文件名缓存的,而不是require()提供的参数,也就是说即使你通过require('tools')和require('./node_modules/tools')加载两次,它不会被重复加载。因为虽然两次参数不一样,但是解析出来的文件是一样的。包管理器:npmnpm官网https://www.npmjs.cn/npm是一个随NodeJS一起安装的包管理工具,可以解决NodeJS代码部署中的很多问题。常见的使用场景如下:服务端下载别人写的第三方包供本地使用。允许用户从npm服务器上下载安装他人编写的命令行程序供本地使用。允许用户将自己的包或命令行程序上传到NPM服务器供他人使用。使用npm命令安装模块,使用语法如下npminstallexpress//本地安装npminstallexpress-g//全局安装本地安装将安装包放在./node_modules(npm命令运行目录)下,如果没有node_modules目录,则会在当前执行npm命令的目录下生成一个node_modules目录。可以通过require()导入本地安装的包。全局安装将安装包放在/usr/local下或者你的node安装目录下。可以直接在命令行使用。package.json用于定义包的属性,接下来让我们创建它:$npminit这个实用程序将引导您创建一个package.json文件。它只涵盖最常见的项目,并尝试猜测合理的默认值。参见`npmhelpjson`以获得有关这些字段及其作用的权威文档。之后使用`npminstall`安装包并将其作为依赖项保存在package.json文件中。随时按^C退出.packagename:(2.Modularization)test//模块名version:(1.0.0)description:nodejsmodularizationdemo//项目描述入口点:(app1.js)testcommand:gitrepository:keywords:author:wanwanlicense:(ISC)即将写入/xx/package.json:{"name":"test","version":"1.0.0","description":"nodejsmodulardemo","main":"app1.js","dependencies":{"express":"^4.17.1"},"devDependencies":{},"scripts":{"test":"echo"Error:notestspecified"&&exit1"},"author":"wanwan","license":"ISC"}这样可以吗?(yes)yesnpm常用命令npmversion查看模块版本npmhelp查看命令的详细帮助npminstall安装模块npmuninstall卸载模块npmupdate更新模块npmoutdated检查模块是否过时npmls查看安装的模块npminit在项目指南中创建package.json文件开发Guide.pdfNode学习指南.pdfCommonJS规范--JavaScript标准参考教程(alpha)完整示例代码:https://github.com/wanwan0306/future/tree/master/Demo/NodeJs/2。模块化