东莞市盛裕绒艺玩具有限公司

东莞市盛裕绒艺玩具有限公司

和记娱乐官方导航

13580143631
联系方式
全国服务热线: 13580143631

咨询热线:15225569216
联系人:贺振华
地址:上海市嘉定区曹安公路5616号财富广场南楼1301室

Node.js(day3)

来源:和记娱乐官方导航   发布时间:2019-11-29   点击量:132

一、模块系统

1.什么是模块

Node.js中常用的核心模块有:

http模块fs文件系统模块url模块path模块os系统模块在使用Node.js中我们发现每个js之间是没有联系的,都是单独的一个作用域,这就是模块系统的设计。(相关概念请参考CommonJs规范)简言之,Node.js中的js不像普通的js具有全局变量,而是以模块(文件)为作用域,不会污染其他文件。而用户书写的js就是自定义模块,下载安装的就是第三方模块,自带的js就是核心模块。既然模块没有了全局作用域,那么我们需要使用模块就需要进行加载和导出通信规则。加载:require()

导出:exports | module.exports

2.exports和module.exports的区别

首先两者都是js文件(模块)用于导出变量的对象,如果你执行这样的语句:

console.log(exports === module.exports);

你会发现结果为true。也就是说这两个变量其实是指向同一个对象的引用。底层源码类似这样:

var module = { exports:{}}var exports = module.exports;

所以我们可以使用exports或module.exports来导出变量。其实exports的作用就是简化module.exports的书写而已。但是需要注意的是,不能对exports直接赋值,类似exports = function(...);这样就切断了var exports = module.exports;这一关系。而底层最后执行的是return module.exports,所以使用exports时注意不能进行赋值操作即可。

3.require加载规则

直接说结论:

require加载本质上都是在加载文件来实现模块功能

加载自定义模块我们在加载自定义文件时只需要写明文件路径即可(基本都会使用相对路径)。比如在我们需要在a.js中价值b.js。(假设在同一级目录),我们只需要写:

var bExports = require("./b");//后缀可省略

另外,require有一个加载机制就是:优先从缓存加载比如现在同级目录下还有一个c.js,且b.js和a.js中都有require("./c")这样的语句。结果就是:执行a.js --> 加载b.js -->加载c.js -->结束。注意,这里c.js并不会加载两次,这是require得优先从缓存加载机制决定的,第一次加载c.js之后会将导出的变量保存到缓存中,下次需要加载c.js时直接从缓存中取出使用即可。这样的机制提高了加载效率。

加载核心模块对于核心模块的加载,我们可能没有见到什么js文件,这其实是Node.js为了用户方便使用直接为我们提供了模块对于的名称,比如http就代表http模块,require("http")其实也是加载了文件的,只是不是直接加载js文件,而是编译后的二进制文件。加载第三方模块首先要使用第三方模块必须使用npm下载安装。比如加载art-template模块,我们只需要:

var template = require("art-template");

第三方模块最终也是加在执行js文件,寻找需要加载文件的步骤为(以require(art-template)):

在执行的js文件的同级文件目录下寻找node_modules文件夹(npm安装的时候会自动创建)在node_modules下找到art-template目录找到package.json文件,读取键为main 的值,一般为index.js。加载找到的js文件。以上情况为正常情况,也可能出现node_modules、art-template、package.json文件、main值找不到的情况,如果是art-template能找到,后面的文件找不到会默认执行index.js,如果index.js也不存在这是会向上一级查找node_modules目录,然后重复以上查找规则,直到找到或查找值磁盘根目录,如果最终都没有找到可以执行的文件会报cannot find module "art-template"的错误信息。

二、包说明文件

上面说到require()在加载第三方模块时会使用到package.json文件,这个文件就是包说明文件。包说明文件中包含了关于包(模块)的相关信息,比如入口main、依赖dependencies等。当我们使用npm install art-template安装art-template模块时,发现生成的node_module文件目录下除了art-template还有许多其他模块,这是因为art-template模块本身也依赖了其他的一些模块,所以也需要安装,以此类推依赖包的依赖包也需要安装。但是这样会存在一个问题,当我们的项目很大,使用的模块也变多的时候,我们可能会忘记我们使用了哪些依赖包,所以我们希望在某个文件下将依赖包的信息记录下来,这是package.json包说明文件的另一个作用。在安装目录下新建一个package.json文件,内容为{}(必需),我们安装模块时常用下面语句(--save)

npm install art-template --save

然后打开package.json文件,发现多了依赖信息:

这样,我们就能记录项目的依赖包信息。(高版本的npm无论有没有--save都会产生一个package-lock.json文件,里面记录的是本次下载安装所有依赖包信息)

我们不必每次都手动创建package.json文件,而是使用npm init来创建。然后会出现一步一步让我们填写关于本项目的基本信息,可一路回车,使用默认设置。另:npm init --y可跳过设置,直接初始化完成。然后我们发现目录下创建了一个package.json文件,并写入了相关信息:

三、npm常用命令

版本查看

npm --versionnpm -v更新npm

npm insatll npm --global安装包

npm installnpm install 包名npm intsall 包名 --save卸载包

npm uninstallnpm uninstall 包名npm uninstall 包名 --save使用帮助

npm helpnpm 命令 --help简写形式

--version 简写为 -vinstall 简写为 iuninstall 简写为 un--save 简写为 -S--help 简写为 -h--global 简写为 -g

四、解决npm被墙的问题

某些npm包资源需属于境外资源,可能被墙,这种时候可能出现安装较慢或失败的情况,为了解决这个问题可以安装npm的国内镜像:cnpmcnpm是淘宝团队对npm在国内的备份,官网地址:点这里安装很简单:

//必需安装到全局npm insatll cnpm -g

然后使用cnpm进行包安装即可,例如:

cnpm install art-template

五、初体验:第三方模块ExpressExpress是高度集成的http模块,提高了我们直接使用http模块进行开发web服务器的效率。相关介绍及使用可参考官网Express。

1.安装

npm install express --save

2.helloWorld

var express = require("express");//创建web服务var app = express();//创建服务器窗口app.listen(8000,function(){ console.log("server running...");});//get请求事件//当以get方式请求为"/"时触发app.get("/",function(req,res){ res.send("hello express.你好express!");});//当以get方式请求为"/about"时触发app.get("/about",(req,res) => { res.send(` <!DOCTYPE html> <html> <head> <title>About me</title> <meta charset="utf-8"> </head> <body> <h1>我是Express...</h1> </body> </html> ` );});

访问情况:

我们发现express相比http简化了一些,首先是api比较简单,其次是对请求的url进行了处理,我们不用再使用request.url来注意判断,,然后是访问不到的路径也进行了处理,最后就是Conten-Type也不需要我们手动设置了。当然express的优点不止这些,后续会逐渐用到。

3.express处理静态资源文件

在之前的http核心模块中我们如果要访问某个目录下的资源文件,需要进行统一处理,然后再根据request.url来判断并使用fs文件系统模块来读取文件并输出到页面,但在express中,我们只需要对目录进行简单的静态处理即可(首先创建一个public目录,里面放置一些资源文件方便试验),我们只需要在刚才的文件中使用这个一个api即可:

//对目录进行静态资源处理,并使用app.use("/public",express.static("./public"));

访问结果:

相关说明

express仅用了一个api就完成了http中需要进行相关判断的操作,且不需要手动创建fs模块来读取文件。express.static("路径")可以将路径转换为可通过url直接访问的静态资源文件。app.use("url访问路径",静态资源文件)是设置静态资源访问的路径,如果不设置默认为/

更多有关Express的使用请参考下一篇文章。

相关产品

COPYRIGHTS©2017 和记娱乐官方导航 ALL RIGHTS RESERVED 备案号:132