当前位置: 首页 > article >正文

node.js 浅析 与 了解

文章目录

    • node.js 与 javascript 浅析
      • 一、概念层面
      • 二、应用场景层面
      • 三、运行环境和模块系统层面
    • node.js 基础知识介绍
      • 1. 模块系统
      • 2. 事件驱动和异步编程
      • 3. 文件系统操作
      • 4. HTTP服务器和客户端
      • 5. 进程和子进程管理
    • node.js =》方向
      • 1. 学习方向
      • 2. 学习方式

node.js 与 javascript 浅析

一、概念层面

  1. JavaScript

    • JavaScript是一种高级的、解释型的编程语言。它主要用于在网页浏览器中实现客户端脚本,为网页添加交互功能。例如,当用户点击一个按钮,通过JavaScript可以实现弹出一个提示框、改变网页元素的样式或者发送一个HTTP请求等操作。
    • 它是一种遵循ECMAScript标准的编程语言,最初设计用于在浏览器中操作DOM(文档对象模型),使得网页可以动态地响应用户的操作。除了浏览器环境,JavaScript还可以在一些其他的宿主环境中运行,如Adobe Acrobat等。
  2. Node.js

    • Node.js是一个基于Chrome V8引擎的JavaScript运行环境。它允许JavaScript在服务器端运行,将JavaScript从浏览器的限制中解放出来。
    • 简单来说,Node.js提供了一系列的模块和工具,使开发者能够使用JavaScript编写服务器端应用程序、命令行工具、网络爬虫等各种类型的软件。例如,使用Node.js可以搭建一个Web服务器来处理HTTP请求和响应,这在传统上是由Java、Python等语言来完成的。

二、应用场景层面

  1. JavaScript

    • 浏览器端应用
      • 是网页开发的核心语言之一。通过操作DOM,JavaScript可以创建动态网页。例如,实现轮播图效果,当用户点击轮播图的左右箭头时,JavaScript可以改变图片的显示顺序和可见性,使页面呈现动态的视觉效果。
      • 用于表单验证。在用户提交表单数据之前,JavaScript可以检查输入的内容是否符合要求。如检查电子邮件地址的格式是否正确,密码长度是否符合要求等。
    • 移动应用开发(通过框架)
      • 可以和一些移动开发框架(如React Native、Ionic等)结合使用,用于开发跨平台的移动应用。以React Native为例,它允许开发者使用JavaScript和React框架来构建在iOS和Android平台上运行的原生应用程序,使代码可以在不同的移动操作系统上复用。
  2. Node.js

    • 服务器端应用
      • 用于构建高性能的Web服务器。像Express.js这样的基于Node.js的框架,可以帮助开发者快速搭建一个功能强大的Web服务器。例如,一个电商网站的后端服务器,使用Node.js可以处理大量的商品数据请求、用户订单处理等操作。
      • 构建实时应用,如聊天应用。Node.js的事件驱动和非阻塞I/O模型非常适合处理大量的并发连接,能够实时地推送消息给客户端。
    • 命令行工具开发
      • 可以方便地开发命令行工具。例如,有一个工具用于将文件从一种格式转换为另一种格式,使用Node.js可以快速地实现文件读取、转换逻辑和输出的功能,并且可以通过npm(Node.js包管理器)进行发布和共享。

三、运行环境和模块系统层面

  1. JavaScript
    • 在浏览器环境中,JavaScript通过浏览器的JavaScript引擎来运行。不同的浏览器(如Chrome、Firefox、Safari等)有自己的JavaScript引擎(Chrome是V8引擎,Firefox是SpiderMonkey引擎等)。
    • 它主要依赖于浏览器提供的全局对象(如window对象)和DOM API来实现功能。在模块系统方面,现代浏览器支持ES6模块,通过importexport语句来导入和导出模块。例如:
    // 定义一个模块,导出一个函数
    export function add(a, b) {
        return a + b;
    }
    // 在另一个模块中导入并使用
    import { add } from './math.js';
    console.log(add(1, 2));
    
  2. Node.js
    • 运行在Node.js运行环境中,其核心是V8引擎,并且有自己的一套模块系统(CommonJS)。在Node.js中,通过require函数来导入模块,使用module.exports来导出模块。例如:
    // 定义一个模块,导出一个函数
    function add(a, b) {
        return a + b;
    }
    module.exports = add;
    // 在另一个模块中导入并使用
    const add = require('./math.js');
    console.log(add(1, 2));
    
    • Node.js还提供了许多内置模块,如fs(用于文件系统操作)、http(用于创建HTTP服务器和客户端)等,这些模块可以方便地用于服务器端开发。例如,使用fs模块可以读取和写入文件内容:
    const fs = require('fs');
    fs.readFile('index.html', 'utf8', (err, data) => {
        if (err) {
            console.error(err);
        } else {
            console.log(data);
        }
    });
    

node.js 基础知识介绍

1. 模块系统

  • CommonJS模块规范
    • 在Node.js中,模块是一个非常重要的概念。它遵循CommonJS规范。每个文件就是一个模块,有自己的作用域。
    • 模块的导出通过module.exportsexports来实现。例如,在一个名为math.js的文件中,可以这样导出一个函数:
    function add(a, b) {
        return a + b;
    }
    module.exports = add;
    
    • 模块的导入使用require函数。在另一个文件中,如果想要使用math.js中的add函数,可以这样写:
    const add = require('./math.js');
    console.log(add(1, 2));
    
  • 核心模块和第三方模块
    • Node.js有许多内置的核心模块,如fs(文件系统)、http(用于创建HTTP服务器和客户端)、path(用于处理文件路径)等。这些核心模块可以直接使用require导入。例如,使用fs模块读取文件:
    const fs = require('fs');
    fs.readFile('example.txt', 'utf8', (err, data) => {
        if (err) {
            console.error(err);
        } else {
            console.log(data);
        }
    });
    
    • 第三方模块可以通过Node.js的包管理器npm(Node Package Manager)进行安装和使用。例如,安装并使用express(一个流行的Web框架):
    • 首先使用命令npm install express安装express模块,然后在代码中使用:
    const express = require('express');
    const app = express();
    app.get('/', (req, res) => {
        res.send('Hello World!');
    });
    app.listen(3000, () => {
        console.log('Server started on port 3000');
    });
    

2. 事件驱动和异步编程

  • 事件循环(Event Loop)
    • Node.js是单线程的,但通过事件循环来处理异步操作,从而实现高效的并发处理。事件循环不断地检查事件队列,当有事件(如I/O操作完成、定时器触发等)发生时,就会执行相应的回调函数。
    • 例如,在一个简单的HTTP服务器中,当有客户端发送请求时,请求事件被放入事件队列,当事件循环检查到这个请求事件时,就会调用相应的请求处理函数来处理请求。
  • 异步I/O操作
    • 大部分的I/O操作(如文件读取、网络请求等)在Node.js中都是异步的。这是通过回调函数来实现的。以文件读取为例:
    const fs = require('fs');
    fs.readFile('test.txt', 'utf8', (err, data) => {
        if (err) {
            console.error(err);
        } else {
            console.log(data);
        }
    });
    console.log('This message will be printed first.');
    
    • 在上面的代码中,readFile函数是异步的。当它开始读取文件时,程序不会等待文件读取完成,而是继续执行后面的代码。当文件读取完成后,回调函数中的代码才会被执行。
  • Promise和Async/Await(较新的异步处理方式)
    • Promise是一种用于处理异步操作的对象。它有三种状态:pending(进行中)、fulfilled(已成功)、rejected(已失败)。可以使用then方法来处理成功的情况,catch方法来处理失败的情况。例如:
    const fs = require('fs').promises;
    fs.readFile('test.txt', 'utf8')
       .then((data) => {
            console.log(data);
        })
       .catch((err) => {
            console.error(err);
        });
    
    • Async/Await是基于Promise的一种更简洁的异步编程语法糖。async函数总是返回一个Promise。在async函数内部,可以使用await关键字来暂停函数的执行,直到一个Promise被解决(resolved)或被拒绝(rejected)。例如:
    async function readFileAsync() {
        try {
            const fs = require('fs').promises;
            const data = await fs.readFile('test.txt', 'utf8');
            console.log(data);
        } catch (err) {
            console.error(err);
        }
    }
    readFileAsync();
    

3. 文件系统操作

  • 读取文件
    • 可以使用fs模块来读取文件。如前面提到的fs.readFile方法,它接受文件路径、编码方式和回调函数作为参数。如果不指定编码方式,返回的是Buffer对象(用于处理二进制数据)。
    const fs = require('fs');
    fs.readFile('binaryFile.bin', (err, data) => {
        if (err) {
            console.error(err);
        } else {
            console.log(data);
        }
    });
    
  • 写入文件
    • 使用fs.writeFile方法来写入文件。它会覆盖原有的文件内容。如果文件不存在,则会创建一个新文件。例如:
    const fs = require('fs');
    const content = 'This is a test content.';
    fs.writeFile('newFile.txt', content, (err) => {
        if (err) {
            console.error(err);
        } else {
            console.log('File written successfully.');
        }
    });
    
  • 文件路径操作
    • path模块用于处理文件路径。它提供了许多实用的函数,如path.join用于拼接路径,path.resolve用于将相对路径转换为绝对路径等。例如:
    const path = require('path');
    const dirPath = path.join(__dirname, 'subdirectory');
    console.log(dirPath);
    const absPath = path.resolve('relativePath');
    console.log(absPath);
    

4. HTTP服务器和客户端

  • 创建HTTP服务器
    • 使用http模块可以创建一个简单的HTTP服务器。例如:
    const http = require('http');
    const server = http.createServer((req, res) => {
        res.writeHead(200, {'Content - Type': 'text/plain'});
        res.end('Hello World!');
    });
    server.listen(3000, () => {
        console.log('Server started on port 3000');
    });
    
    • 在这个例子中,createServer函数接受一个回调函数作为参数,这个回调函数会在每次有客户端请求时被调用。req表示请求对象,res表示响应对象。
  • 发送HTTP请求(作为客户端)
    • 可以使用http模块或者更方便的第三方模块(如axiosrequest)来发送HTTP请求。以axios为例,首先需要安装axiosnpm install axios),然后可以这样发送请求:
    const axios = require('axios');
    axios.get('https://api.example.com/data')
       .then((response) => {
            console.log(response.data);
        })
       .catch((error) => {
            console.error(error);
        });
    

5. 进程和子进程管理

  • 进程(Process)概念
    • 在Node.js中,每个运行的脚本都在一个独立的进程中。可以通过process对象来获取当前进程的相关信息,如process.argv可以获取命令行参数,process.env可以获取环境变量。例如:
    console.log(process.argv);
    console.log(process.env.NODE_ENV);
    
  • 子进程(Child Process)操作
    • 可以使用child_process模块来创建和管理子进程。例如,使用child_process.exec来执行一个外部命令:
    const { exec } = require('child_process');
    exec('ls -l', (err, stdout, stderr) => {
        if (err) {
            console.error(err);
        } else {
            console.log(stdout);
        }
    });
    
    • 还可以使用child_process.fork来创建一个Node.js子进程,用于在多个进程中运行代码,实现更好的性能和资源利用。例如:
    const { fork } = require('child_process');
    const child = fork('childScript.js');
    child.on('message', (message) => {
        console.log('Received message from child:', message);
    });
    child.send('Hello from parent!');
    

node.js =》方向

1. 学习方向

  • 服务器端开发
    • Web应用开发
      • 学习使用Express或Koa等框架构建Web服务器。了解如何处理HTTP请求和响应,包括路由设置(如定义不同URL路径对应的处理函数)、中间件的使用(如用于日志记录、身份验证等)。例如,在Express中可以这样设置路由:
      const express = require('express');
      const app = express();
      app.get('/', (req, res) => {
          res.send('Welcome to the homepage!');
      });
      app.get('/about', (req, res) => {
          res.send('This is the about page.');
      });
      app.listen(3000, () => {
          console.log('Server started on port 3000');
      });
      
    • API开发
      • 专注于构建RESTful API。这需要掌握如何正确地设计API端点、处理数据序列化和反序列化(例如使用JSON格式),以及如何实现安全的API(如使用JSON Web Tokens进行身份验证)。例如,一个简单的API端点用于获取用户信息可以这样实现:
      const express = require('express');
      const app = express();
      app.get('/api/users', (req, res) => {
          const users = [
              { id: 1, name: 'John' },
              { id: 2, name: 'Jane' }
          ];
          res.json(users);
      });
      app.listen(3000, () => {
          console.log('Server started on port 3000');
      });
      
  • 命令行工具开发
    • 学习如何使用Node.js开发命令行工具。这包括解析命令行参数(可以使用yargsminimist等库)、与文件系统和外部进程交互。例如,使用yargs创建一个简单的命令行工具来复制文件:
    const yargs = require('yargs');
    const fs = require('fs');
    const path = require('path');
    yargs.command('copy <source> <destination>', 'Copy a file', (yargs) => {
        // 定义参数类型等
    }, (argv) => {
        const source = argv.source;
        const destination = argv.destination;
        fs.copyFile(source, destination, (err) => {
            if (err) {
                console.error(err);
            } else {
                console.log(`File copied from ${source} to ${destination}`);
            }
        });
    }).argv;
    
  • 网络编程
    • 构建网络应用(非Web)
      • 了解如何使用Node.js的netdgram模块进行TCP和UDP编程。例如,使用net模块创建一个简单的TCP服务器:
      const net = require('net');
      const server = net.createServer((socket) => {
          socket.write('Welcome to the TCP server!\n');
          socket.on('data', (data) => {
              console.log('Received data:', data.toString());
              socket.write('You sent: ' + data.toString());
          });
      });
      server.listen(3000, () => {
          console.log('TCP server started on port 3000');
      });
      
    • WebSocket开发
      • 学习使用wssocket.io等库来开发实时通信的WebSocket应用,如聊天应用或实时数据更新的应用。例如,使用socket.io构建一个简单的聊天应用:
      const express = require('express');
      const app = express();
      const http = require('http');
      const server = http.createServer(app);
      const { Server } = require('socket.io');
      const io = new Server(server);
      io.on('connection', (socket) => {
          console.log('A user connected');
          socket.on('chat message', (msg) => {
              console.log('Message received:', msg);
              io.emit('chat message', msg);
          });
      });
      app.get('/', (req, res) => {
          res.sendFile(__dirname + '/index.html');
      });
      server.listen(3000, () => {
          console.log('Server started on port 3000');
      });
      
  • 数据库交互
    • 关系型数据库
      • 学习如何使用Node.js与关系型数据库(如MySQL或PostgreSQL)交互。可以使用mysqlpg等驱动库。例如,使用mysql库查询数据库中的数据:
      const mysql = require('mysql');
      const connection = mysql.createConnection({
          host: 'localhost',
          user: 'root',
          password: 'password',
          database: 'mydb'
      });
      connection.connect();
      connection.query('SELECT * FROM users', (err, results, fields) => {
          if (err) {
              console.error(err);
          } else {
              console.log(results);
          }
          connection.end();
      });
      
    • 非关系型数据库
      • 对于非关系型数据库(如MongoDB),可以使用mongodb驱动或Mongoose(一个用于MongoDB的对象模型工具)。例如,使用Mongoose定义一个简单的模式并保存数据:
      const mongoose = require('mongoose');
      mongoose.connect('mongodb://localhost/mydb',
       { useNewUrlParser: true, useUnifiedTopology: true });
      const userSchema = new mongoose.Schema({
          name: String,
          age: Number
      });
      const User = mongoose.model('User', userSchema);
      const newUser = new User({ name: 'John', age: 30 });
      newUser.save((err, user) => {
          if (err) {
              console.error(err);
          } else {
              console.log('User saved:', user);
          }
      });
      

2. 学习方式

  • 官方文档学习
    • Node.js官方文档是非常权威和全面的学习资源。它详细介绍了Node.js的核心模块、API用法、示例代码等。可以从基础的模块(如fshttp)开始学习,按照文档中的示例代码自己动手实践。例如,在学习http模块创建服务器时,仔细阅读文档中的参数说明和示例,然后尝试修改代码,如改变响应的内容类型或处理不同类型的请求方法。
  • 在线课程学习
    • 许多在线学习平台(如Coursera、Udemy、edX等)提供高质量的Node.js课程。这些课程通常由经验丰富的讲师授课,课程内容包括从基础概念到实际项目开发的完整体系。例如,在Udemy上的一些课程会通过构建一个完整的Web应用(包括前端和后端)来教授Node.js的相关知识,学生可以跟着课程逐步完成项目,从而更好地理解和掌握知识。
  • 书籍学习
    • 有许多关于Node.js的优秀书籍。例如,《Node.js实战》这本书从实际应用的角度出发,涵盖了Node.js在服务器端开发、命令行工具开发等多个方面的内容。书中通过丰富的示例代码和案例分析帮助读者深入理解Node.js的原理和应用场景。可以按照书籍的章节顺序进行学习,同时结合书中的代码示例在自己的开发环境中进行实践。
  • 参与开源项目和社区
    • 在GitHub等平台上寻找一些感兴趣的Node.js开源项目进行参与。可以从阅读项目代码开始,了解别人是如何使用Node.js进行开发的,学习优秀的代码结构和设计模式。同时,也可以积极参与Node.js社区,如在Stack Overflow的Node.js标签下回答问题或提问,或者加入Node.js相关的论坛和讨论组,与其他开发者交流学习经验和开发技巧。
  • 实践项目开发
    • 自己动手开发一些小项目是学习Node.js的有效方式。可以从简单的命令行工具开始,如开发一个文件搜索工具,用于在指定目录下搜索包含特定关键字的文件。然后逐步过渡到更复杂的项目,如开发一个Web应用或一个网络应用。在项目开发过程中,会遇到各种实际问题,通过解决这些问题可以加深对Node.js知识的理解和掌握。

http://www.kler.cn/a/464049.html

相关文章:

  • 现代光学基础4
  • 豆包ai 生成动态tree 增、删、改以及上移下移 html+jquery
  • 框架模块说明 #09 日志模块_01
  • 《Java 数据结构》
  • 【pytorch】现代循环神经网络-2
  • Linux中隐藏操作身法
  • 【视觉SLAM:十一、设计SLAM系统】
  • 人大金仓数据库基于Linux系统的数据库软件安装指南
  • PlantUML 时序图 基本例子
  • 民宿酒店预订系统小程序+uniapp全开源+搭建教程
  • Vue演练场基础知识(三)
  • UVM:testbench architecture
  • AI大模型系列之七:Transformer架构讲解
  • awk使用
  • 【ArcGISPro/GeoScenePro】检查并处理高程数据
  • 3. C语言 数据类型
  • 硬件设计-关于ADS54J60的校准问题
  • HTML——54. form元素属性
  • 开源漏洞管理工具--Faraday
  • springboot541党员学习交流平台(论文+源码)_kaic
  • 案例分享|快速了解实时湖仓集一体技术如何助力企业降本增效
  • 如何通过设置失效时间清除本地存储的数据
  • SpringMVC(三)请求
  • 51c自动驾驶~合集44
  • 信息安全、网络安全和数据安全的区别和联系
  • SpringBoot返回文件让前端下载的几种方式