无题,说不上学习的起因,只是因为在学习打算外面而已。
是什么?
我在学 JavaScript 的时候是在浏览器面看输入和后果,所以浏览器就是 JavaScript 的运行环境之一。Node.js 是 JavaScript 的另一个运行环境,基于 Chrome V8 引擎,开源跨平台,能够让 JavaScript 在浏览器之外执行,应用 Node.js 能够用来开发服务端应用程序。
咱们当初装下 Node.js,Node.js 的下载地址: https://nodejs.org/en/。
下载过后一路 next,next 就行。而后关上命令行输出 node -v,呈现下图代表装置胜利:
代表装置胜利。
Hello World
那怎么在浏览器之外运行 JavaScript? 首先你须要一个 js 文件, 而后在终端外面执行 node js 文件名即可,如下图所示:
还能帮咱们干什么?
Node.js 能够帮忙咱们干啥,让咱们再去翻翻官网文档:
As an asynchronous event-driven JavaScript runtime, Node.js is designed to build scalable network applications. In the following “hello world” example, many connections can be handled concurrently. Upon each connection, the callback is fired, but if there is no work to be done, Node.js will sleep.
Node.js 是一个异步事件驱动 JavaScript 运行时,为构建高扩大的网络应用而生,上面的“hello world”例子,能够并发解决连贯,每个连贯筹备结束,回调将会被激活。然而如果没有网络连接,node.js 将会进入“睡眠”。
我上面建设了一个 app.js, 外面的代码如下:
// 引入 http 模块
const http = require('http'); // 语句一
const hostname = '127.0.0.1';
const port = 3000;
// 建设一个 web 服务器, 监听本机的 3000 端口
// 连贯建设的时候会返回 hello world
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World');
});
server.listen(port, hostname, () => {
// eslint-disable-next-line no-console
console.log(`Server running at http://${hostname}:${port}/`);
});
成果如下:
所以 node.js 让 javaScript 有了开发服务端利用的能力。咱们当初来认真扫视一下 app.js 的语句一这一行,语句一代表引入 node.js 提供的 http 模块。原生的 JavaScript 并没有内置网络相干的库,所以 node.js 提供了诸多扩大,让 JavaScript 具备了和支流后端一样的能力,node.js 提供的扩大能力如下:
- Debugger debug 能力
- modules 内置模块和模块化
- Console 控制台 于 JavaScript
- Cluster 集群
- Add-ons 和 C /C++ 进行通信
- Buffer 二进制数据类型 JavaScript 语言本身只有字符串数据类型,没有二进制数据类型。但在解决像 TCP 流或文件流时,必须应用到二进制数据。因而在 Node.js 中,定义了一个 Buffer 类,该类用来创立一个专门寄存二进制数据的缓存区。
- Callbacks 回调是函数异步的产物。在给定工作实现时回调函数。node.js 中大量应用回调。Node 的所有 API 都以反对回调的形式编写。
- Crypto 加解密库
- Error Handing 错误处理
- DNS 解析域名
- net 网络库
- global 全局成员变量
- Streaming 流式数据 文件 I / O 相干
node.js 罕用内置模块:
- path 文件门路模块 不同操作系统平台的门路分隔符不同,path 用来屏蔽
- fs File System 文件系统模块 对文件进行操作
- 事件模块 node.js 的外围 API 都是基于事件驱动的,在这个体系中,某些对象 (发射器) 收回某一事件,咱们能够监听这一事件,传入回调函数,监听事件满足,就会触发这个函数的调用。
- http 模块 像我的项目的 app.js,咱们就是通过 require 引入了 http 模块,做了一个小型的 http 服务器。
其实在后端程序员里,模块化是天经地义的事件,因为服务端开发须要用到大量的第三方类库,所以复用代码也是天经地义的事件。然而对于 JavaScript 来说确并不是这样,起初的 JavaScript 只用来写一些简略的网页脚本,然而随着互联网的倒退,当初曾经有了运行大量 JavaScript 脚本的简单程序,所以将 JavaScript 程序拆分为可按序导入的独自模块的机制就提上议程来。然而即便有这个迫切的需要,但这个愿景却没有来得那么快,所以 JavaScript 社区就自发推出了模块化库:
- CommonJS
- 基于 AMD 的其余模块零碎
- Webpack
- Babel
Node.js 也用 CommonJS 提供了模块化的能力,所以在 Node.js 中咱们就能复用他人的代码,这也就是 npm
npm
npm 是 Node Package Manager 的缩写,也就是 node.js 的包管理器,相似于 Java 中的 maven,装置 node.js 的时候会主动附带 npm。那咱们要引入第三方库就要做一些规定,比方包名,版本,形容,开源协定。在终端中执行: npm init。就会以后我的项目生成 package.json。上面是我执行 npm init 生成的 package.json:
{
"name": "helloworld", // 我的项目名
"version": "1.0.0", // 版本
"description": "这是一个 node 学习我的项目",// 形容
"main": "app.js",// 入口文件生命了导出哪些函数给内部应用, 哪些对外部凋谢。"scripts": {"dev": "node helloWorld.js"},
"author": "", // 作者"license":"ISC",// 开源协定"dependencies": {"express":"^4.18.1" // 依赖于哪些包}
}
scripts: npm 容许在 package.json 文件中,应用 scripts 字段定义脚本。咱们就能够用 node run dev 代替 node helloWorld.js。利用 scripts 编写一些简单的脚本. 下面咱们提到了第三方库,那第三方库都放在哪里呢?上面这个连贯就是第三方库地址: https://www.npmjs.com/,npm 默认去这个仓库寻找,这个库是放在国外的,所以加载起来不会很快,国内有对应的镜像: https://registry.npm.taobao.org,那如何替换默认仓库地址呢:
# 找 express 去 https://registry.npm.taobao.org 找
npm --registry https://registry.npm.taobao.org install express
# 永恒替换
npm config set registry https://registry.npm.taobao.org
# 通过上面命令来判断 是否替换实现。npm config get registry
在 Node.js 中咱们能够用 npm 来引入第三方库。在终端中执行如下命令: npm install express, 就相当于为咱们的我的项目引入了 express 框架。装置胜利我的项目上面会多出一个 node_modules 文件夹,咱们引入的第三方库就在这个文件夹里。写到这里,可能有同学会问,那我有很多个我的项目,有些第三方库是独特引入的,是否全局引入的?当然能够。
# 全局装置 express. -g = -gloabl, 个别默认的装置地位是: 在 C:\Users\ 你的用户 \AppData\Roaming\npm\node_modules
npm install express -g
# 查看全局装置地位
npm root -g
# 批改默认装置地位
npm config set prefix "D:\Program Files\nodejs\node_modules\npm"
在 VsCode 中装置全局包,如果不是以管理员身份来运行,就会报没权限,以管理员权限运行就不会有这个问题。
总结一下
node.js = javaScript Runtime + Java Script Libary。node.js 为 JavaScript 提供了模块化和一些库,所以咱们能够应用 node.js 开发服务端程序。
参考资料
- Node 入门 https://www.nodebeginner.org/…
- Node addons 简介 https://zhuanlan.zhihu.com/p/…
- 淘宝 npm 镜像源设置 https://segmentfault.com/a/11…