无题,说不上学习的起因,只是因为在学习打算外面而已。
是什么?
我在学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 worldconst 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_modulesnpm 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...