​Node.js 教程(一) 基本概念与基本使用

简介: ​Node.js 教程(一) 基本概念与基本使用

是什么?

我在学JavaScript的时候是在浏览器面看输出和结果,所以浏览器就是JavaScript的运行环境之一。Node.js是JavaScript的另一个运行环境,基于Chrome V8引擎,开源跨平台,可以让JavaScript在浏览器之外执行,使用Node.js可以用来开发服务端应用程序。

我们现在装下Node.js,Node.js的下载地址: https://nodejs.org/en/

微信图片_20221010160350.jpg

下载过后一路next,next就行。然后打开命令行输入node -v, 出现下图代表安装成功:

微信图片_20221010160353.jpg

代表安装成功。

Hello World

那怎么在浏览器之外运行JavaScript?  首先你需要一个js文件, 然后在终端里面执行node js文件名即可,如下图所示:

微信图片_20221010160355.jpg

还能帮我们干什么?

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}/`);
});

效果如下:  

微信图片_20221010160449.jpg

所以node.js让javaScript有了开发服务端应用的能力。我们现在来仔细审视一下app.js的语句一这一行,语句一代表引入node.js提供的http模块。原生的JavaScript并没有内置网络相关的库,所以node.js提供了诸多扩展,让JavaScript具备了和主流后端一样的能力,node.js提供的扩展能力如下:

微信图片_20221010160452.jpg

  • Debugger  debug 能力
  • modules    内置模块和模块化
  • Console   控制台  
  • 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开发服务端程序。

相关文章
|
3天前
|
自然语言处理 JavaScript 前端开发
JavaScript中闭包:概念、用途与潜在问题
【4月更文挑战第22天】JavaScript中的闭包是函数及其相关词法环境的组合,允许访问外部作用域,常用于数据封装、回调函数和装饰器。然而,不恰当使用可能导致内存泄漏和性能下降。为避免问题,需及时解除引用,减少不必要的闭包,以及优化闭包使用。理解并慎用闭包是关键。
|
3天前
|
存储 JavaScript 前端开发
解释 JavaScript 中的作用域和作用域链的概念。
【4月更文挑战第4天】JavaScript作用域定义了变量和函数的可见范围,静态决定于编码时。每个函数作为对象拥有`scope`属性,关联运行期上下文集合。执行上下文在函数执行时创建,定义执行环境,每次调用函数都会生成独特上下文。作用域链是按层级组织的作用域集合,自内向外查找变量。变量查找遵循从当前执行上下文到全局上下文的顺序,若找不到则抛出异常。
22 6
|
3天前
|
JavaScript 前端开发 网络协议
​Node.js 教程(一) 基本概念与基本使用
​Node.js 教程(一) 基本概念与基本使用
|
3天前
|
JavaScript 前端开发 网络安全
【网络安全 | 信息收集】JS文件信息收集工具LinkFinder安装使用教程
【网络安全 | 信息收集】JS文件信息收集工具LinkFinder安装使用教程
16 4
|
3天前
|
Web App开发 JavaScript 前端开发
《手把手教你》系列技巧篇(三十九)-java+ selenium自动化测试-JavaScript的调用执行-上篇(详解教程)
【5月更文挑战第3天】本文介绍了如何在Web自动化测试中使用JavaScript执行器(JavascriptExecutor)来完成Selenium API无法处理的任务。首先,需要将WebDriver转换为JavascriptExecutor对象,然后通过executeScript方法执行JavaScript代码。示例用法包括设置JS代码字符串并调用executeScript。文章提供了两个实战场景:一是当时间插件限制输入时,用JS去除元素的readonly属性;二是处理需滚动才能显示的元素,利用JS滚动页面。还给出了一个滚动到底部的代码示例,并提供了详细步骤和解释。
31 10
|
3天前
|
存储 JavaScript 前端开发
Javascript教程
Javascript教程
9 0
|
3天前
|
设计模式 JavaScript 前端开发
在JavaScript中,继承是一个重要的概念
【5月更文挑战第9天】JavaScript继承有优点和缺点。优点包括代码复用、扩展性和层次结构清晰。缺点涉及深继承导致的复杂性、紧耦合、单一继承限制、隐藏父类方法以及可能的性能问题。在使用时需谨慎,并考虑其他设计模式。
15 2
|
3天前
|
JavaScript 前端开发 Java
《手把手教你》系列技巧篇(四十)-java+ selenium自动化测试-JavaScript的调用执行-下篇(详解教程)
【5月更文挑战第4天】本文介绍了如何使用JavaScriptExecutor在自动化测试中实现元素高亮显示。通过创建并执行JS代码,可以改变元素的样式,例如设置背景色和边框,以突出显示被操作的元素。文中提供了一个Java示例,展示了如何在Selenium中使用此方法,并附有代码截图和运行效果展示。该技术有助于跟踪和理解测试过程中的元素交互。
10 0
|
3天前
|
JavaScript 前端开发
JavaScript的概念
JavaScript的概念
|
3天前
|
JavaScript 前端开发
11.JavaScript 事件的概念以及绑定方法
11.JavaScript 事件的概念以及绑定方法