node基础:初始化你的后端项目

前言

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境。它允许我们使用 JavaScript 在服务器端运行脚本,创建动态网页内容,而不仅仅是局限于浏览器端。Node.js 使用了事件驱动、非阻塞式 I/O 模型,使其轻量且高效,特别适用于数据密集型的实时应用,如实时聊天应用、实时通知推送、在线游戏服务器等。对于今后的全栈开发来说,熟悉掌握并且运用node进行开发是必不可少的。

说人话就是:node是用c/c++打造的js引擎,他能读懂js并且让js有跟操作系统打交道的能力

学习node.js少不了查阅官方文档,在node.js的官方文档中,node.js的安装教程和使用方法,各种指令等等都十分详尽。我将带大家一步步了解并运用它。

Node.js 中文网 (nodejs.cn)

初始化后端

运用以下指令初始化我们的后端项目

js 复制代码
     npm init  -y

在指令输出后我们将会生成 package.json 文件

这个文件相当于是我们开发的说明书,我们可以清楚的看到项目的名称name,版本,项目描述和作者等等。我们可以对这个文件做出更改或添加说明。

安装node的开发框架

express 是一个基于 Node.js 平台,快速、开放、极简的 web 应用框架。它提供了一系列强大的特性来帮助我们创建各种 Web 和移动设备应用。Express 框架是在 Node.js 的 http 模块之上构建的一个更高级的抽象层,它允许我们更快地开发复杂的 web 应用。

js 复制代码
    npm i express

我们同样可以通过 npm uninstall express 卸载这个包。卸载后在node_modules中的express依赖包将被移除。

当我们着手开发一个新项目而不太确定具体步骤时,查阅相关文档是一个极好的起点。特别是在决定需要安装哪些包或依赖来辅助开发时,npm.js的官方文档成为了一个不可或缺的资源。通过搜索npm.js上的安装包或依赖项,我们可以找到详尽的说明、使用指南以及社区贡献的教程,这些都能指导我们按照步骤逐步推进项目开发。因此,利用npm.js官方文档,我们能够确保在开发过程中安装并配置好所有必要的工具与库,从而顺利地进行项目构建。 npm | Home (npmjs.com)

开发你的后端项目

创建入口文件index.js,引入express包,创建express实例对象;创建端口,向端口发送请求,使用 app.listen(port,()=>{}) 监听这个端口。

js 复制代码
const express = require('express');

const app = express();

const port = 3000

app.get('/', (req, res) => {
    res.send(' 恭喜第一次启动后端项目!')
})
app.listen(port, () => {
    console.log('项目运行在3000端口')
})

在浏览器访问你访问的端口:localhost:3000

恭喜你第一次启动后端项目!

在浏览器中通过检查打开后台,我们同样可以观察到我们后端项目的启动

当你觉得每次启动后端项目都要重新敲index.js太麻烦时,我们可以通过另一种方式------------通过调试 package.json文件中的scripts去创造你想要的指令。

例如,我在scripts中输入 "dev": " node index.js"后,就能通过npm run dev替代node index.js启动项目。

在你后端项目需要不断调试时可以使用npx nodemon .\index.js指令,他运行你的后台实时刷新。

模块化

在Node.js中,模块系统占据了核心地位,它赋予开发者将代码划分为独立且可复用的单元的能力。这种模块化设计显著提升了代码的组织性、可维护性和可重用性。尽管存在包括CommonJS、AMD、CMD、UMD和ESM在内的多种模块规范,但Node.js主要采用的是CommonJS规范作为其模块化的基石。通过require()函数同步加载模块,并使用module.exportsexports对象导出模块中的功能,Node.js的CommonJS模块系统为开发者提供了一个强大而灵活的代码组织方式。

如何使用模块语法?

CommonJS模块语法

如,当我在function.js文件中定义了两个方法时,我需要使用将他抛出,在到另一个文件中使用。

js 复制代码
function add(a, b) {
    return a + b
}

function minus(a, b) {
    return a - b
}

module.exports = { add, minus }
// 还可以通过module.exports.add = add,module.exports.minus = minus抛出
// 可以直接通过exports.add = add抛出
js 复制代码
const { add, minus } = require('./function')

console.log(add(1, 2), minus(1, 2))
  • CommonJS的node环境通过使用require()函数来同步加载模块,并通过module.exportsexports对象来导出模块中的变量、函数、类等的方法
  • ESM中,使用import语句来导入模块,使用export语句来导出模块的方法混用。

在文件开发中两种规范不能重用,因为他们互不兼容。但是我们可以通过在package.json文件中设置"type": "module"来实现使用ESM规范。

这意味着可以通过 export default方法导出函数等等

ESM(JS原生)模块语法

方法一: 当抛出的是一个对象时,你可以自定义一个变量名来导入模块中的默认内容。

js 复制代码
    // 导出文件
    function add(a, b) {
    return a + b
    }

    function minus(a, b) {
    return a - b
    }

    export default {
    add, minus
    }
js 复制代码
// 引入文件
import module from './function.js'

console.log(module)

方法二: 当使用命名导出时,需要使用import关键字后跟大括号{},并在其中列出要导入的命名导出项。

js 复制代码
    // 导出文件
    export function add(a, b) {
    return a + b
    }

    export function minus(a, b) {
    return a - b
    }
js 复制代码
    // 引入文件
    import { add, minus } from './function.js'

    console.log(add(1, 2), minus(1, 2))

node中的模块------fs模块

node中的fs模块是专门操作文件的模块,这里简单介绍他的三个基本作用。

  1. 读取某文件中的数据

当你需要从一个文件中读取内容时,可以选择使用readFile()(异步)或readFileSync()(同步)方法,,通过指定文件的路径和编码格式(选择正确的阿斯克码;如'utf-8'以正确处理中文)。

当我我在text.txt文件中写入一堆中文后,我可以通过以下方法读取这个文件的内容:

js 复制代码
const fs = require('fs');

//同步读取,识别成中文
const content = fs.readFileSync('./text.txt', 'utf-8')  

console.log(content);
  1. 创建并写入(修改)文件

fs模块同样提供了写入文件的功能。如果文件已存在,使用writeFileSync()(同步)或writeFile()(异步)方法会覆盖原有内容;如果文件不存在,则会创建新文件并写入数据。

示例:使用writeFileSync创建或修改文件

js 复制代码
const fs = require('fs'); 
// 创建或修改文件,写入'hello world',并指定编码为'utf-8' 
fs.writeFileSync('./text.txt', 'hello world', 'utf-8');
  1. 查看文件的详细信息

除了基本的读写操作外,fs模块还允许你获取文件的详细信息,如文件大小、创建时间、修改时间等。这可以通过statSync()(同步)或stat()(异步)方法实现。

示例:使用statSync查看文件详细信息

要获取text.txt文件的详细信息,你可以使用statSync方法。这将返回一个fs.Stats对象,包含了文件的多种属性。

js 复制代码
const fs = require('fs');
// 获取文件详细信息
const stats = fs.statSync('./text.txt'); 
console.log(stats); 
// 输出文件的详细信息,如大小、创建时间等

如下图为查询到的文件的详细创建时间,数据大小等等信息

global属性

我们可以通过Object.getOwnPropertyNames() 访问一个对象上的所有属性

js 复制代码
    console.log(Object.getOwnPropertyNames(global));

在这些属性中有几个特殊的属性

  • 我们可以通过__dirname__filename去访问当前文件夹和当前文件所在的位置。

  • 我们可以通过process查看有关当前Node.js进程的信息和控制能力。题外话,看懂process你就会发现------------vue.js的脚手架就是node.js写的。

  • Buffer是node.js另外打造的一种数据模式,提供了一种用于处理二进制数据的方式。你可以使用 Buffer.alloc(1024) 初始化大小为1kb的数据流时终端中会显示如下16进制的Buffer流。

他还可以通过 Buffer.from() 将字符串或数组转换为Buffer流类型

js 复制代码
console.log(Buffer.from('hello world'));
console.log(Buffer.from([68]));

对应,上为转换后的字符串,下为数组:

Buffer上也提供了转换回字符串的方法:

js 复制代码
const buf = Buffer.from('hello world');
console.log(buf.toString());
相关推荐
野生技术架构师5 小时前
2026 Java 面试全套总结,八股 + 场景 + AI 相关面试考点
java·人工智能·面试
狗头大军之江苏分军6 小时前
《潮水漫过十七岁》开学了
后端
苏三说技术7 小时前
如何看待GPT-6在UP主众测中碾压夺冠?它是现在最强大模型吗?
后端
mldong7 小时前
一份 JSON,一条能跑的审批流:把报销流程送上工作流引擎
后端·架构
wno7047 小时前
Spring Boot WebFlux增删改查
java·spring boot·后端
Captaincc7 小时前
AI用量v0.1.11更新发布 新增 jusage doctor 诊断指令 托盘展示token 和余额 新增 AutoClaw 支持
前端·后端·vibecoding
aramae8 小时前
模拟实现strlen()函数 (C语言)
c语言·开发语言·后端
计算机魔术师8 小时前
德国Wiki被黑后两周,OpenAI终于把模型失控的账本摊开了
前端
kyriewen9 小时前
我让 AI 当面试官面了我一轮:第 3 个追问我就卡住了(附 10 道追问清单)
前端·面试·ai编程
IT_陈寒9 小时前
Python的GIL把我坑惨了,多线程跑得比单线程还慢
前端·人工智能·后端