Node.js知识点详解(一)基础部分

2023-11-19

模块

Node.js 提供了exports 和 require 两个对象,其中 exports 是模块公开的接口,require 用于从外部获取一个模块的接口,即所获取模块的 exports 对象。
接下来我们就来创建hello.js文件,代码如下:

exports.world = function() {
  console.log('Hello World');
}

在以上示例中,hello.js 通过 exports 对象把 world 作为模块的访问接口,在 main.js 中通过 require('./hello') 加载这个模块,然后就可以直接访 问main.js 中 exports 对象的成员函数了。

require方法接受以下几种参数的传递:

http、fs、path等,原生模块。
./mod或../mod,相对路径的文件模块。
/pathtomodule/mod,绝对路径的文件模块。
mod,非原生模块的文件模块。

我们以计算圆的周长和面积的两个方法为例:

var PI = Math.PI;
exports.area = function (r) {
    return PI*r*r;
};//exports 是对象,向外提供了area方法接口
 
exports.circumference = function (r) {
    return 2*PI*r;
};

以上保存为circle.js,下方通过require调用模块:

var circle = require("./circle.js");//require通过引入模块文件,找到exports对象提供的接口
console.log("The area of a circle of radius 4 is " + circle.area(4));

编写稍大一点的程序时一般都会将代码模块化。在NodeJS中,一般将代码合理拆分到不同的JS文件中,每一个文件就是一个模块,而文件路径就是模块名。

在编写每个模块时,都有require、exports、module三个预先定义好的变量可供使用。
模块名可使用相对路径(以./开头),或者是绝对路径(以/或C:之类的盘符开头)。另外,模块名中的.js扩展名可以省略。

模块化的优缺点:

a>优点:
可维护性
1.灵活架构,焦点分离
2.方便模块间组合、分解
3.方便单个模块功能调试、升级
4.多人协作互不干扰
可测试性
1.可分单元测试

b>缺点:
性能损耗
1.系统分层,调用链会很长
2.模块间通信,模块间发送消息会很耗性能

Node.js常用模块和组件

 包管理 Package Management: NPM 
 框架 Framework: ExpressJS 
 模板 Template: Jade 
 中间件 Middleware: Connect 
 WebSocket: Socket.io 
 数据库 Database: Mongo DB (选了个自己喜欢的) 
 Mongoose (as a MongoDB ORM) 
 调错 Debugging: Node Inspector 
 测试 Test: Mocha + should.js 
 控制无止境的内嵌回调 (Control the Callback flow): Async

Node.js可以做什么?

Web开发:Express + EJS + Mongoose/MySQL

express 是轻量灵活的Nodejs Web应用框架,它可以快速地搭建网站。
Express框架建立在Nodejs内置的Http模块上,并对Http模块再包装,从而实际Web请求处理的功能。

ejs是一个嵌入的Javascript模板引擎,通过编译生成HTML的代码。

mongoose 是MongoDB的对象模型工具,通过Mongoose框架,可以进行访问MongoDB的操作。

mysql 是连接MySQL数据库的通信API,可以进行访问MySQL的操作。

通常用Node.js做Web开发,需要3个框架配合使用,就像Java中的SSH。

Web聊天室(IM):Express + Socket.io

socket.io一个是基于Nodejs架构体系的,支持websocket的协议用于时时通信的一个软件包。socket.io 给跨浏览器构建实时应用提供了完整的封装,socket.io完全由javascript实现。

Web爬虫:Cheerio/Request

cheerio 是一个为服务器特别定制的,快速、灵活、封装jQuery核心功能工具包。Cheerio包括了 jQuery核心的子集,从jQuery库中去除了所有DOM不一致性和浏览器不兼容的部分,揭示了它真正优雅的API。Cheerio工作在一个非常简 单,一致的DOM模型之上,解析、操作、渲染都变得难以置信的高效。基础的端到端的基准测试显示Cheerio大约比JSDOM快八倍(8x)。 Cheerio封装了@FB55兼容的htmlparser,几乎能够解析任何的 HTML 和 XML document。

Web博客:Hexo

Hexo 是一个简单地、轻量地、基于Node的一个静态博客框架。通过Hexo我们可以快速创建自己的博客,仅需要几条命令就可以完成。

发布时,Hexo可以部署在自己的Node服务器上面,也可以部署github上面。对于个人用户来说,部署在github上好处颇多,不仅可以省 去服务器的成本,还可以减少各种系统运维的麻烦事(系统管理、备份、网络)。所以,基于github的个人站点,正在开始流行起来….

前端包管理平台: bower.js

Bower 是 twitter 推出的一款包管理工具,基于nodejs的模块化思想,把功能分散到各个模块中,让模块和模块之间存在联系,通过 Bower 来管理模块间的这种联系。

单线程

javascript语言的执行环境是"单线程"(single thread)。
所谓"单线程",就是指一次只能完成一件任务。如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推。

这种模式的好处是实现起来比较简单,执行环境相对单纯;坏处是只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行。常见的浏览器无 响应(假死),往往就是因为某一段Javascript代码长时间运行(比如死循环),导致整个页面卡在这个地方,其他任务无法执行。

大部分 Web 应用的瓶颈都在 I/O, 即读写磁盘,读写网络,读写数据库。使用怎样的策略等待这段时间,就成了改善性能的关键点

同步与异步

为了解决这个问题,Javascript语言将任务的执行模式分成两种:同步(Synchronous)和异步(Asynchronous)。

"同步模式"就是上一段的模式,后一个任务等待前一个任务结束,然后再执行,程序的执行顺序与任务的排列顺序是一致的、同步的;"异步模式"则完全不同, 每一个任务有一个或多个回调函数(callback),前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务则是不等前一个任务结束就执 行,所以程序的执行顺序与任务的排列顺序是不一致的、异步的。

"异步模式"非常重要。在浏览器端,耗时很长的操作都应该异步执行,避免浏览器失去响应,最好的例子就是Ajax操作。在服务器端,"异步模式"甚至是唯一的模式,因为执行环境是单线程的,如果允许同步执行所有http请求,服务器性能会急剧下降,很快就会失去响应。

进程与线程

mac系统中的进程与线程

从图中我们可以看出,一个进程可以包括多个线程,进程就好比工程里的车间,线程就是这个车间的工人,在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度。

区别

线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文。多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定。线程的运行中需要使用计算机的内存资源和CPU。

模块和包

模块

模块:一个实现某些特定功能的文件,以实现模块化编程。通过require(模块名)引入模块.
—模块中的功能(如:变量,函数)通过赋给exports对象的某个属性提供给调用者使用。

模块是可重用的代码库。比如用来与数据库交互的模块、支持web开发的模块以及通过web套接字协助通信的模块

如何使用模块?

在Node中使用模块是非常方便的,在 JavaScript 代码中可以直接使用全局函数 require() 来加载一个模块。例如,我们可以使用require("http")来加载node中自带的http服务器模块,

包是一个文件夹,它将模块封装起来,用于发布、更新、依赖管理和版本控制。通过package.json来描述包的信息:入口文件,依赖的外部包等等。通过npm install命令来安装包,并通过require使用包。

package.json

在开发Node.js应用程序的时候,一个一个模块的安装显然很耗时,又或是忘了安装某个模块怎么办?npm允许开发人员使用package.json文件来指定在应用程序中要用的模块,并且通过单个命令来安装它们:

npm install

package.json文件仅包含以特定格式表示的项目信息。一个最小的package.json文件会是这样:

{
    "name" : "example 1",
    "version": "0.0.2",
    "dependencies":{
       "underscore":"~1.2.1"
    }
}

使用package.json文件意味着我们无需记忆应用程序会依赖于哪些模块,其他开发人员会发现,可以很简单地安装你的应用程序

npm install <name>安装nodejs的依赖包
npm install <name> -g  将包安装到全局环境中
npm install <name> --save  安装的同时,将信息写入package.json中
npm init  会引导你创建一个package.json文件,包括名称、版本、作者这些信息等
npm remove <name>移除
npm update <name>更新 

Package.json的属性

name - 包的名称

version - 包的版本

description - 包的描述

homepage - 包主页

author - 包的作者

contributors - 贡献者到包的名字

dependencies - 依赖关系的列表。NPM自动安装所有在这里的包node_module文件夹中提到的依赖关系。

repository - 包的库类型和URL

main - 包的入口点

keywords - 关键字

npm install module-name -save 自动把模块和版本号添加到dependencies部分
npm install module-name -save-dve 自动把模块和版本号添加到devdependencies部分

异步式 I/O 与事件驱动

Node.js 的异步机制是基于事件的,I/O 是输入输出的意思,指的是计算机和人或者数据处理系统之间的通信。可以将I/O 想成是数据在一次输入和一次输出之间的移动。

每一个 I/O就是一次请求,所有的磁盘 I/O、网络通信、数据库查询都以非阻塞的方式请求,返回的结果由事件循环来处理。如下图所示:

Node.js 进程在同一时刻只会处理一个事件,完成后立即进入事件循环检查并处理后面的事件。这样做的好处是,CPU 和内存在同一时间集中处理一件事,同时尽可能让耗时的 I/O 操作并行执行

开始node编程

在这里,我推荐大家使用webstorm进行node.js的开发,方便又快捷,比起cmd,或者Mac下的终端都好用太多了。

至于node的安装大家就自行百度吧,这里就不赘述了,看下webstorm下的node编程界面吧:
我们只需要在编写好的node代码界面按鼠标右键,然后点击Run就行啦,方便又快捷吧

下面是node的输出界面:

Mac系统下进行web开发,我推荐大家使用的三款工具是:coda2这些是目前我已经的最好的开发工具了,大家不妨试试哪个更符合自己的口味。

webstorm进行node开发需要先配置一定的文件,大家就自行百度吧,因为我的webstorm已经配置好了,所以没法截图给大家看步骤了,大概步骤是,在mac系统下是先点击顶部栏的webstorm,然后点击perference,然后点击Node.js and NPM,然后在右侧点击configure配置,最后大概会是下面这个样子:

windows系统下和这个流程步骤大概相似啊,我使用的版本是8.0.4的。

全局变量

在js编程中,我们最好给每个变量都添加上var关键字,以免污染全局命名空间,提高代码的耦合风险。

console

console用于向标准输出流standout(stdout)和标准错误流(stderr)输出字符。

console.log()向标准输出流打印字符并以换行符结束,其接受多个参数,将以类似C语言的printf()格式输出

console.log(__dirname)输出文件目录

计算代码运行时间

    console.time(label)
    console.timeEnd(label)

我们只需在开始和结束那里给同样一个标签即可,中间放你想要计算执行时间的任何代码。

__filename__dirname

    console.log(__filename);// /Users/hwax/Desktop/My Project/avalon/hello.js
    console.log(__dirname);// /Users/hwax/Desktop/My Project/avalon

__filename:开发期间,该行代码所在的文件。
__dirname:开发期间,该行代码所在的目录。

path.join([path1],[path2],[...])

合并参数得到一个标准化的路径字符串

path.join('/foo', 'bar', 'baz/abc')
// returns
'/foo/bar/baz/abc'  

运行hello world程序

首先在终端输入:

trigkit4:~ trigkit4$ vi index.js

进入vim后输入i,进入编辑模式,然后输入:

var http = require('http');
http.createServer(function(req,res){
        res.writeHead(200,{'Content-Type':'text/plain'});
        res.end("Hello World\n");
}).listen(8124,"127.0.0.1");
console.log("Server running at http://127.0.0.1:8124/");

然后按ESC,退出编辑模式,输入:w保存,再输入:q退出

然后接着在终端输入如下命令:

trigkit4:~ trigkit4$ node index

可以看到终端输出了:

Server running at http://127.0.0.1:8124/

然后打开浏览器,输入地址即可看到输出hello world

Node.js包目录

一般一个Node.js的包的根目录结构如下:

 .gitignore —— 从git上忽略的文件清单
 .npmignore —— 不包括npm注册库中的文件清单
 LICENSE —— 包的授权文件
 README.md —— 以markdown格式编写的readme文件
 bin —— 保存包可执行文件的文件夹
 doc —— 保存包文档的文件夹
 examples —— 保存如何使用包的实例文件夹
 lib —— 保存包代码的文件夹
 man —— 保存包的手册页的文件夹
 package.json —— 描述包的json文件
 src —— 保存C/C++源文件的文件夹
 deps —— 保存包所用到的依赖文件夹
 test —— 保存模块测试的文件夹
 index.js —— 包的入口文件

 "scripts": {//“scripts”是一个由脚本命令组成的hash对象,他们在包不同的生命周期中被执行。key是生命周期事件,value是要运行的命令。
        "test": "node ./libuv/test.js"
      },
"main": "index.js",//包的入口文件,如不指定,则为根目录下的index.js
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node.js知识点详解(一)基础部分 的相关文章

  • Node/Express 4.0 中可以声明全局变量吗

    我有多个需要访问数据库的路线 对于开发我使用本地数据库 显然生产我使用托管数据库 唯一的问题是每次我去推送版本时我都必须手动更改数据库链接 e g var mongodb require mongojs connect urlhere Co
  • 使用express/connect-redis在页面重新加载时抓取现有会话

    使用 connect express 和 socket io 我试图让我的应用程序在重新连接时获取会话详细信息 我的会话显然在客户端连接时工作 但如果我刷新浏览器上的页面 它会忘记所有内容 我的会话cookie肯定是一样的 所以不是那样的
  • NodeJS“加密”哈希似乎产生与 Crypto-JS javascript 库不同的输出

    我正在使用 NodeJS 的捆绑包crypto http nodejs org api crypto html crypto class hash服务器端 SHA256 哈希模块 在客户端 我使用一个名为的 javascript 库Cryp
  • 使用 NodeJS、Express 和 Passport-ldapauth 进行 LDAP 身份验证

    我在使用标题中提到的工具 应用程序对 Active Directory 服务器进行身份验证时遇到问题 我正在使用测试AD环境发现here http www forumsys com tutorials integration how to
  • 如何异步构建我的测试套件?

    我正在尝试使用必须异步加载的配置为我的控制器创建摩卡测试 下面是我的代码 但是 当运行摩卡测试时 它不会运行任何测试 显示0 passing The console logs 甚至从未被调用过 我尝试做before next gt conf
  • 使用 Node.js 捕获延迟加载页面的屏幕截图

    我正在寻找一种方法 可以在每次更改时对长网页进行屏幕截图 我想为此使用 Node js 我的问题是关于如何渲染带有图像的完整页面并将其保存到磁盘和图像文件 网页上的大多数图像都是延迟加载的 所以我想我需要先向下滚动整个页面 然后再进行屏幕截
  • NestJS:使用 JWT 将验证选项添加到 AuthGuard

    我正在尝试利用AuthGuard装饰器和护照 JWT 策略 遵循文档 https docs nestjs com techniques authentication 文档中的所有内容都运行良好 但我现在想保护 JWT 中包含的范围的路由 这
  • 启动服务器后,带有sequelize的Nodejs无法在mysql工作台中创建表

    我开始学习如何使用构建 Rest APINodejs Expressjs Sequelize and MySQL using Mysqlworkbench 我的问题 启动服务器后 该表不是由Sequelize并且没有表Mysqlworkbe
  • 从nodemailer为nodejs发送电子邮件

    当我尝试从 nodemailer 发送电子邮件时 出现错误 EAUTH API 我尝试过同时使用 Hotmail 和 Gmail 作为我的服务 因为我从文档中了解到 如果 Gmail 不起作用 就不要使用它 然而 这似乎不是问题 我想使用此
  • Mongoose:转换为 ObjectId 失败

    我正在尝试在 MongoDB 中创建一个类别层次结构 以便通过 Mongoose 与 Node js 一起使用 我正在使用祖先数组方法 http docs mongodb org manual tutorial model tree str
  • 使用 docker 在 NodeJS 上对 Postgres 进行 ECONNREFUSED

    我正在使用 postgresql 构建一个在 NodeJS 上运行的应用程序 我使用 SequelizeJS 作为 ORM 为了避免使用真正的 postgres 守护进程并在我自己的设备上使用 nodejs 我使用带有 docker com
  • 使用 process.on('uncaughtException 显示 500 错误页面

    我正在开发一个快速应用程序 我的 server js 目前有以下内容 process on uncaughtException function err console log UNCAUGHT EXCEPTION console log
  • 如何在电子中使用 import 或 require

    我正在尝试构建一个电子应用程序 我想从另一个js文件导入一些函数 但是在使用导入时我收到错误显示 不能在模块外部使用 import 语句 为什么会发生这种情况 我的代码是 eventsource js import sample from
  • express.js 示例应用程序[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在启动一个express js 项目 我想查看现有大型应用程序的代码 尤其是它们的文件系统结构 有
  • Mongoose 选择要从 findOneAndUpdate 返回的字段

    在 Nodejs 中使用 Mongoose 您可以使用 find 返回一些字段 例如 User findOne id 132324 first name 1 last name 1 exec 但我似乎无法弄清楚如何使用 findOneAnd
  • 使用express记录所有GraphQL响应

    我成功地设置了记录 graphQL 错误 app use graphql graphqlHTTP request gt return schema rootValue request formatError error gt const p
  • 切换活动链接 Bootstrap 导航栏

    我读过很多关于这个主题的帖子 发现几乎总是相同的解决方案 但它对我不起作用 我的问题如下 我想使用 Twitter Bootstrap 2 3 2 及其导航栏 因此我包含了 css 和 js 文件 在此之前 我还包括 jquery 然后我举
  • 导出socket.io时无法读取未定义的属性“socket”

    我正在尝试模块化我的应用程序 并希望在不同的 js 文件上向客户端发出不同的事件 下面的示例代码显示将从 led js 触发事件 onlinestatus 然而我不断收到消息 类型错误 无法读取未定义的属性 套接字 每当我尝试从 led j
  • Node.js -expressjs -multer req.files 输出为空

    我正在使用 multer 从此表单获取文件
  • 使用 mocha/chai 确保 REST API 提供文件?

    我想验证对 REST API 端点之一的调用是否正在提供文件 但我不确定如何进行操作 并且我没有看到任何相关示例 我确实看过文档 http chaijs com api bdd 但这对我没有多大帮助 服务器端代码本质上是 在 Express

随机推荐

  • 数据分析01——Anaconda安装/Anaconda中的pip换源/jupyter配置

    0 前言 数据分析三大模块知识 numpy 数组计算 pandas 基于numpy开发 用于数据清洗和数据分析 matplotlib 实现数据可视化 1 Anaconda安装 安装Anaconda 注意安装路径不一定是c盘 但是安装目录不要
  • Python Excel操作模块XlsxWriter之写入worksheet.write()

    worksheet write wirte row col args 向工作表单元格写入普通的数据 参数 row 单元格所在的行 索引从0开始计数 col 单元格所在的列 索引从0开始计数 args 传递到子方法的附加参数诸如数字 字符串
  • 端口介绍

    文章来源 https m toutiaocdn com group 6680437870504706572 app news article timestamp 1563010542 req id 201907131735410100230
  • Linux lvm管理讲解及命令

    作者 小刘在C站 个人主页 小刘主页 每天分享云计算网络运维课堂笔记 努力不一定有回报 但一定会有收获加油 一起努力 共赴美好人生 夕阳下 是最美的绽放 树高千尺 落叶归根人生不易 人间真情 前言 目录 一 lvm管理 1 Logical
  • mysql sql优化方法_一个MySql Sql 优化技巧分享

    有天发现一个带inner join的sql 执行速度虽然不是很慢 0 1 0 2 但是没有达到理想速度 两个表关联 且关联的字段都是主键 查询的字段是唯一索引 sql如下 SELECTp item token p item product
  • 如何在小程序实现人脸识别的方法

    1 获取用户授权 在小程序中实现人脸识别需要先获取用户的授权 用户需要允许小程序访问他们的摄像头和图像数据 这样才能进行人脸识别 2 采集图像数据 在获得用户授权后 小程序可以通过摄像头或者相册功能 采集用户的面部图像数据 3 使用图像处理
  • Java-private构造方法

    private 构造函数一般用于Singleton模式 指的是整个应用只有本类的一个对象 一般这种类都有一个类似getInstance 的方法 class A public String name 构造函数限定为private 不可以直接创
  • 标准差(Standard Deviation), 标准误差(Standard error),变异系数 (Coefficient of Variance )的区别与联系

    标准差 Standard Deviation 中文环境中又常称均方差 是离均差平方的算术平均数的平方根 用 表示 标准差是方差的算术平方根 标准差能反映一个数据集的离散程度 平均数相同的两组数据 标准差未必相同 标准误差 Standard
  • 学习Flask之Flask-Login 用户会话管理

    Flask Login 用户控制用户会话管理 简单点说 就是控制登录 如果是自己写的登录系统 一般都是通过操作session 然后后台根据session 来判断权限 Flask Login 就是负责这部分 直接开始 安装 pip insta
  • System.Data.OracleClient 需要 Oracle 客户端软件 version 8.1.7 或更高版本

    同学的电脑连接实验室的服务器时出现 System Data OracleClient 需要 Oracle 客户端软件 version 8 1 7 或更高版本 而我自己的电脑可以轻松连接服务器的数据库 首先 实验室用的是Oracle 12c
  • 力扣 942. 增减字符串匹配 双指针解法C++

    给定只含 I 增大 或 D 减小 的字符串 S 令 N S length 返回 0 1 N 的任意排列 A 使得对于所有 i 0 N 1 都有 如果 S i I 那么 A i lt A i 1 如果 S i D 那么 A i gt A i
  • TensorRT(11):python版本序列化保存与加载模型

    TensorRT系列传送门 不定期更新 深度框架 TensorRT 文章目录 一 序列化保存模型 二 反序列化加载模型 三 完整代码 楼主曾经在TensorRT 7 python版本使用入门一文中简要记录了python版本是序列化与反序列化
  • 成为编程高手的二十二条军规

    1 大学生活丰富多彩 会令你一生都难忘 但难忘有很多种 你可以学了很多东西而难忘 也会因为什么都没学到而难忘 2 计算机专业是一个很枯燥的专业 但即来之 则安之 只要你努力学 也会发现其中的乐趣的 3 记住 万丈高楼平地起 基础很重要 尤其
  • 数据挖掘:数据(数据对象与属性类型)

    一 概述 现实中的数据一般有噪声 数量庞大并且可能来自异种数据源 数据集由数据对象组成 一个数据对象代表一个实体 数据对象 又称样本 实例 数据点或对象 数据对象以数据元组的形式存放在数据库中 数据库的行对应于数据对象 列对应于属性 属性是
  • WIN10下怎么找到MYSQL数据库中存储数据的位置。

    版权声明 本文为博主原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接和本声明 本文链接 https blog csdn net qq 36098284 article details 79841920 今天我想找到
  • C++中Template的用法

    模板 Template 指C 程序设计设计语言中采用类型作为参数的程序设计 支持通用程序设计 C 的标准库提供许多有用的函数大多结合了模板的观念 如STL以及IO Stream 函数模板 函数模板定义一族函数 template1 cpp i
  • LDSC:连锁不平衡回归分析

    欢迎关注 生信修炼手册 LDSC全称如下 linkage disequilibrium score regression 简称LDSR或者LDSC 在维基百科中 对该技术进行了简单介绍 通过GWAS分析可以识别到与表型相关的SNP位点 然而
  • Kettle同步表数据null处理

    kettle同步数据时会将空字符串 自动转换为 null 如果表字段非空则会报错 解决方案如下 方案一 kettle菜单栏 编辑 编辑kettle properties文件 配置项 KETTLE EMPTY STRING DIFFERS F
  • 制作及运行 WebUI(NovelAI)Docker 镜像

    准备 Novel AI 模型文件 下载地址 magnet xt urn btih 5bde442da86265b670a3e5ea3163afad2c6f8ecc 只需要部分下载其中的文件 必须的文件 文件 stableckpt anime
  • Node.js知识点详解(一)基础部分

    模块 Node js 提供了exports 和 require 两个对象 其中 exports 是模块公开的接口 require 用于从外部获取一个模块的接口 即所获取模块的 exports 对象 接下来我们就来创建hello js文件 代