二三(Node2)、Node.js 模块化、package.json、npm 软件包管理器、nodemon、Express、同源、跨域、CORS

Node.js day-01 Node.js 基于Chrome V8 引擎封装,独立执行 JS 代码,但是语法和浏览器环境的 V8 有所不同,没有 document 和 window 但是都支持 ECMAScript 标准的代码语法。Node.js 作用除了编写后端应用程序,也可以对前端代码进行压缩,转译,整合等等,提高前端开发和运行效率。什么是 Node.js,有什么用,为何能独立执行 JS 代码,演示安装和执行 JS 文件内代码。Node.js 是一个独立的 JavaScript 运行环境,能。 阅读详情

1. Node.js 模块化

1.1 CommonJS 标准

utils.js

/**
 * 目标:基于 CommonJS 标准语法,封装属性和方法并导出
 */
const baseURL = "http://hmajax.itheima.net";
const getArraySum = (arr) => arr.reduce((sum, item) => (sum += item), 0);

module.exports = {
  baseURL,
  getArraySum,
};

index.js

/**
 * 目标:基于 CommonJS 标准语法,导入工具属性和方法使用
 */

/* 
  模块化:每个文件都是独立的模块,需要标准语法导出和导入进行使用

  CommonJS 标准 - 导出和导入模块
  ➢ 导出:module.exports = {}
  ➢ 导入:require('模块名或路径')

  ➢ 内置模块,直接写名字。例如:fs,path,http等
  ➢ 自定义模块,写模块文件路径。例如:./utils.js
*/

// 解构导入的数据
// const { baseURL, getArraySum } = require("./utils");
const { baseURL, getArraySum } = require("./utils.js");

console.log(baseURL); // http://hmajax.itheima.net
console.log(getArraySum([1, 5, 8])); // 14

1.2 ECMAScript 标准 - 默认导出和导入

utils.js

/**
 * 目标:基于 ECMAScript 标准语法,封装属性和方法并"默认"导出
 */
const baseURL = "http://hmajax.itheima.net";
const getArraySum = (arr) => arr.reduce((sum, item) => (sum += item), 0);

export default {
  baseURL,
  getArraySum,
};

package.json

{
  "type": "module"
}

index.js

/**
 * 目标:基于 ECMAScript 标准语法,"默认"导入,工具属性和方法使用
 */

/* 
  1. ECMAScript 标准 - 默认导出和导入模块
  ➢ 导出:export default {}
  ➢ 导入:import 变量名 from '模块名或路径'
  
  2. Node.js 切换模块标准为 ECMAScript
  ➢ 运行模块所在文件夹,新建 package.json 并设置{ "type" : "module" }
*/

import obj from "./utils.js";
console.log(obj.baseURL); // http://hmajax.itheima.net
console.log(obj.getArraySum([1, 4, 7])); // 12

1.3 ECMAScript 标准 - 命名导出和导入

utils.js

/**
 * 目标:基于 ECMAScript 标准语法,封装属性和方法并"命名"导出
 */
export const baseURL = "http://hmajax.itheima.net";
export const getArraySum = (arr) => arr.reduce((sum, item) => (sum += item), 0);

package.json

{
  "type": "module"
}

index.js

/**
 * 目标:基于 ECMAScript 标准语法,"命名"导入,工具属性和方法使用
 */

/* 
  ECMAScript 标准,命名导出和导入的语法
  ➢ 导出:export 修饰定义的语句
  ➢ 导入:import { 同名变量 } from '模块名或路径'

  按需加载,使用命名导出和导入
  全部加载,使用默认导出和导入
*/

import { getArraySum, baseURL } from "./utils.js";
console.log(baseURL); // http://hmajax.itheima.net
console.log(getArraySum([1, 5, 8, 12, 234])); // 260

2. 软件包

/* 
  1. 什么是包?
  ➢ 将模块,代码,其他资料聚合成的文件夹

  2. 包分为哪 2 类呢?
  ➢ 项目包:编写项目代码的文件夹
  ➢ 软件包:封装工具和方法供开发者使用

  3. package.json 文件的作用?
  ➢ 记录软件包的名字,作者,入口文件等信息
  
  4. 导入一个包文件夹的时候,导入的是哪个文件?
  ➢ 默认 index.js 文件,或者 main 属性指定的文件
*/

3. npm 软件包管理器

3.1 npm - 软件包管理器

/**
 * 目标:使用 npm 下载 dayjs 软件包来格式化日期时间
 *  1. (可选)初始化项目清单文件,命令:npm init -y
 *  2. 下载软件包到当前项目,命令:npm i 软件包名称
 *  3. 使用软件包
 */

/*
  npm config set registry xxx 这个命令用于设置 npm(Node Package Manager)的注册表地址
  默认情况下,npm 使用官方的 npm 注册表 (https://registry.npmjs.org),
  但有时为了加快下载速度或访问某些特定的包,用户可能会选择使用镜像源。

  1. 将 npm 的注册表设置为一个镜像源(在中国境内可能更快)
  npm config set registry http://registry.npmmirror.com

  2. 安装 dayjs 这个日期处理库; i - install
  npm i dayjs
*/

/* 
  1. npm 软件包管理器作用?
    ➢ 下载软件包以及管理版本
  2. 初始化项目清单文件 package.json 命令?
    ➢ npm init -y
  3. 下载软件包的命令?
    ➢ npm i 软件包名字
  4. 下载的包会存放在哪里?
    ➢ 当前项目下的 node_modules 中,并记录在 package.json 中
*/

const dayjs = require("dayjs");
const res = dayjs().format("YYYY-MM-DD");
console.log(res); // 2024-12-12

3.2 npm - 安装所有依赖

/**
 * 目标:安装所有依赖软件包
 * 场景:一般拿到别人的项目后,只有 package.json 缺少 node_modules 时需要做
 * 语法:在当前项目终端下,输入命令:npm i
 * 效果:会根据 package.json 记录的所有包和版本开始下载
 */

/* 
  1. 当项目中只有 package.json 没有 node_modules 怎么办?
    ➢ 当前项目下,执行 npm i 安装所有依赖软件包
  2. 为什么 node_modules 不进行传递?
    ➢ 因为用 npm 下载比磁盘传递要快
*/

// 格式化日期
const dayjs = require("dayjs");
const nowDateStr = dayjs().format("YYYY-MM-DD");
console.log(nowDateStr); // 2024-12-12

// 求数组里最大值
const _ = require("lodash");
console.log(_.max([1, 2, 8, 3, 4, 5])); // 8

4. npm 全局软件包 nodemon

/**
 * 目标:使用 nodemon 全局软件包,检测文件变化,自动重启程序
 * 语法:
 *  1. 安装 nodemon 全局软件包,命令:npm i nodemon -g
 *  2. 使用 nodemon 来执行目标 js 文件
 * 体验:启动后,修改代码,保存后观察终端效果
 */

/* 
  1. 本地软件包和全局软件包区别?
  ➢ 本地软件包,作用在当前项目,封装属性和方法
  ➢ 全局软件包,本机所有项目使用,封装命令和工具

  2. nodemon 作用?
  ➢ 替代 node 命令,检测代码更改,自动重启程序
  
  3. nodemon 怎么用?
  ➢ 先确保安装 npm i nodemon -g
  ➢ 使用 nodemon 执行目标 js 文件
*/

// 格式化日期
const dayjs = require("dayjs");
const nowDateStr = dayjs().format("YYYY-MM-DD");
console.log(nowDateStr);

// 求数组里最大值
const _ = require("lodash");
console.log(_.max([1, 10, 2, 3, 4, 55]));

5. Node.js 总结

/**
 * 总结:
 * Node.js模块:
 *  概念:每个文件就是一个模块,独立作用域,按需加载,需使用特定语法导出导入
 *  CommonJS 标准语法:
 *    导出:module.exports = {}
 *    导入:require('模块名或路径')
 *  ECMAScript 标准语法:
 *    默认导出:export default {}
 *    默认导入:import 变量名 from '模块名或路径'
 *    命名导出:export 修饰定义语句
 *    命名导入:import { 同名变量 } from '模块名或路径'
 *
 * Node.js包:
 *  概念:把模块文件,代码文件,其他资料聚合成一个文件夹
 *  项目包:编写项目需求和业务逻辑的文件夹
 *  软件包:封装工具/方法的文件夹(一般用 npm 管理)
 *    本地软件包:封装属性/方法,在当前项目中使用,例如:dayjs,lodash
 *    全局软件包:封装工具/命令,在本机中使用,例如:nodemon
 *
 * 常用命令:
 *  执行 js 文件:node xxx
 *  初始化 package.json: npm init -y
 *  下载本地软件包:npm i 软件包名
 *  下载全局软件包:npm i 软件包名 -g
 *  删除软件包:npm uni 软件包名
 */

6. Express 搭建 Web 服务

/* 
  Express - 框架
  使用 express 本地软件包,快速搭建 Web 服务(基于 http 模块)

  功能:1. 提供数据接口 2. 提供网页资源等
*/

// 1. 下载 express 软件包
const express = require("express");

// 2. 导入并创建 Web 服务对象
const server = express();

// 3. 监听请求的方法和请求的资源路径
server.get("/", (req, res) => {
  res.send("哦耶 express");
});

// 4. 监听任意请求的方法和请求的资源路径
server.all("*", (req, res) => {
  res.status(404);
  res.send("您访问的资源不存在");
});

// 5. 监听端口号,启动 Web 服务
server.listen(3000, () => {
  console.log("启动成功成功");
});

7. 获取省份列表 - 接口开发

/**
 * 目标:基于 express 软件包,开发提供省份列表的数据接口
 * 要求:get 请求方法,/api/province 的请求路径
 */

const fs = require("fs");
const path = require("path");
const express = require("express");
const server = express();

// 监听 get 请求方法,
// 监听资源路径 /api/province,
// 读取 province.json 省份数据返回
server.get("/api/province", (req, res) => {
  fs.readFile(path.join(__dirname, "/data/province.json"), (err, data) => {
    if (err) {
      console.log(err);
    } else {
      res.send(data.toString());
    }
  });
});

server.all("*", (req, res) => {
  res.status(404);
  res.send("你要访问的资源路径不存在");
});

server.listen(3000, () => {
  console.log("Web 服务已启动");
});

8. 跨域以及解决方案

8.1 浏览器的同源策略

/**
 * 目标:了解浏览器中的同源策略
 * 同源策略:是一种安全策略,限制一个源的文档/脚本与另外一个源的资源交互
 *
 * 好处:保护网站的安全,减少被攻击的媒介
 * 限制:浏览器限制 AJAX 只能访问同源的 URL 网址!
 *
 * 源:指的 URL 中的协议,域名,端口号
 * 同源:网页加载所在的源,与 AJAX 请求的源完全相同即为同源
 */

8.2 跨域问题

/* 
  跨域访问:
    网页所在源和 AJAX 请求的源(协议,域名,端口号)不完全相同,就发生跨域访问
*/

8.3 跨域问题 - 解决方案1 - CORS

/* 
  跨域问题 - 解决方案1 - CORS
  目标:前后端分离的项目,前端和后端不在一个源,还要保证数据通信
  解决:
    采用 CORS (跨域资源共享),一种基于 HTTP 头的机制,
    该机制通过允许服务器标示除了它自己以外的其他源(域、协议或端口),
    使得浏览器允许这些源访问加载自己的资源

  步骤:
  1. 下载 cors 本地软件包
  2. 导入 cors 函数
  3. 使用 server.use() 给 Web 服务添加插件功能
  4. 把 cors 函数调用传入给 Web 服务,启动测试

  1. 为什么要解决跨域问题?
  ➢ 因为前后端分离的项目,不在同一个源去开发项目
  ➢ 需要保证数据之间通信
  
  2. 跨域问题如何解决?
  ➢ 让后端开启 CORS 跨域资源共享
  ➢ 在响应头设置 Access-Control-Allow-Origin: *
*/

// 2. 导入 cors 函数
const cors = require("cors");
// 3. 使用 server.use() 给 Web 服务添加插件功能
server.use(cors());

8.4 跨域问题 - 解决方案2 - 同源访问

/* 
  跨域问题 - 解决方案2 - 同源访问
  目标:开发环境用 cors,上线部署关闭 cors,并采用同源访问方式
  做法:让后端 Web 服务既可以提供数据接口,也可以返回网页资源
  好处:安全,后端的接口不允许非同源来访问

  1. CORS 只适用于什么阶段的项目?
  ➢ 本地开发阶段项目
  
  2. 项目上线,如何解决跨域问题?
  ➢ 把前端项目和后端项目部署到同一个源下访问
*/

// 暴露指定的文件夹,让前端可以直接拼接路径和资源名字来访问
server.use(express.static(path.join(__dirname, "public")));

要配置西门子G120XA变频器实现**端子启停**和**Modbus RTU(485)频率给定 如有问题,可通过STARTER软件在线诊断Modbus通讯状态。要配置西门子G120AX变频器实现。 阅读详情

相关推荐

单目视觉定位:深入解析PNP算法在机器人导航中的实战应用

本文深入解析了PNP算法在机器人单目视觉定位中的核心原理与实战应用。通过拆解坐标变换四步,详细阐述了如何从二维图像点反求相机三维位姿。文章结合OpenCV的solvePnP函数,提供了算法选择、参数调优及结果后处理的实用指南,并针对机器人导航中的特征匹配、尺度不确定性等挑战,给出了鲁棒性优化与实时性平衡的解决方案。

weixin_29083649的博客 419

前端实用插件-日期处理工具Day.js

day.js工具使用介绍,基础实用方法介绍

qq_38192105的博客 2822

【CODESYS】-软件Bug与处理方法(20240710更)

【CODESYS】-软件Bug与处理方法(不定期更新)

qq_35316470的博客 5186

Node.js 使用dayjs组件库格式化时间(年-月-日 时-分-秒)

微笑的java欢迎关注转发评论点赞沟通,让编码不在孤单。

三流程序员,三流的技术,一流的态度和真心,期待和你们交流合作🤝🤝🤝。 3689

荔枝派Lichee Nano全志F1C100s烧录避坑指南:从Fel模式到SPI Flash完整流程

本文详细介绍了荔枝派Lichee Nano基于全志F1C100s芯片的SPI Flash烧录完整流程,从FEL模式进入技巧到定制化sunxi-tools编译,再到分区策略与实战烧录步骤。针对开发者常见的烧录程序问题提供了专业解决方案,帮助用户高效完成嵌入式系统部署。

tea88的博客 788

基于Java的高校校园点餐系统

本文介绍了一个基于Java技术开发的高校校园点餐系统,该系统以B/S结构为基础,采用MySQL作为数据库,实现了一个高效、便捷的在线点餐平台。系统主要面向三类用户:管理员、用户和食堂工作人员,提供包括用户管理、食堂管理、菜单管理、订单管理等在内的多项功能。通过系统的具体测试,验证了其可行性和有效性,为高校师生提供了一个科学化、系统化的点餐服务。高校校园点餐系统的开发和实现,不仅提高了校园餐饮服务的效率和质量,也为师生提供了一个更加便捷的点餐体验。

a632341031的博客 840

Moment.js日期处理库的使用

Moment.jsMoment.js是一个轻量级的JavaScript时间库,它方便了日常开发中对时间的操作,提高了开发效率。这个在一些金融保险公司会经常用到,比如一下时间的格式化处理,时...

孙叫兽的博客 2787

SAP公司间外协业务流程以及配置说明

SAP公司间外协业务流程以及配置说明

竹大的博客 7171

NODEJS day_01(5.19)全局对象 、 模块

一、Node.js 概述 Node.js是运行在服务器端JS环境 1.JS和Node.js的区别 (1)JS运行在浏览器,有多种解释器,存在代码兼容性问题;Node.js运行在服务器,只有谷歌v8引擎一种环境,不存在代码兼容性问题。 (2)两者都有共同的自定义对象和内置对象,不同的宿主对象 (3)作用不同,JS用于开发浏览器端的用户交互效果,Node.js用于后端开发,例如数据库访问、调用其他服务器...

m0_70328115的博客 288

eCognition易康操作教程(二):多尺度分割基于多光谱数据构建规则集,结合DSM高程数据提取建筑物、树木和绿地

一、数据 数据来源:教程中的实验数据,共包含RGB三个波段,还有数字地表模型(以下简称DSM)文件。 图一 RGB影像 数据特征:数据范围较小,要素种类少,仅包含较多的建筑和大片的绿地。由于建筑的房顶使用的材料和材料颜色不同,所以建筑的光谱特征没有规律,是不连续的特征。而绿地的光谱特征则十分容易分辨。 但是建筑通常具有规则的形状,而且建筑相比于周围其他要素...

蒹葭苍苍 8303

S7-200SMART通过表格指令实现模拟量信号滑动平均值滤波的具体方法

S7-200SMART通过表格指令实现模拟量信号滑动平均值滤波的具体方法

Robot_PLC_HMI_Automation 6727

nodejs 中 dayjs模块的空值处理

在node项目中,前台展示使用了dayjs对时间进行格式化,发现时间排序不对,经查发现dayjs把时间为空的值处理成了当前时间,解决办法是在服务端给时间赋值避免此问题 ...

Xilingshidai的博客 1470

第01章 Hermes Agent 是什么

如果读者所在的开发团队已经引入了 Cursor、Claude Code 这类 AI IDE,可能会有一个困惑:写代码已经有 AI 帮忙了,还需要 Hermes Agent 做什么?这一章将给出答案。Hermes Agent 不是另一个写代码的 AI,而是一个常驻在团队里的"AI 协作成员",专门负责写代码之外的协作环节——讨论需求、审查代码、查日志、监控告警、生成报告。学完本章,读者将清楚 Hermes 的定位以及它在团队里的角色。

亢少军的博客 75

MERN全栈开发实战:从环境搭建到部署的完整闭环

MERN栈是以JavaScript为核心、JSON为统一数据格式的现代Web全栈开发范式,涵盖MongoDB(文档型数据库)、Express(轻量级Web框架)、React(声明式UI库)和Node.js(服务端运行时)。其核心原理在于前后端共享语言与数据模型,消除序列化/反序列化开销,显著缩短开发反馈回路。技术价值体现在降低全栈学习门槛、加速MVP验证、提升小团队协作效率。典型应用场景包括内部管理系统、内容展示平台、电商原型及高校课程设计项目。本文聚焦Windows本地环境搭建、跨域联调、MongoDB文

深未来技术 467

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

全栈开发一年速成指南:从零到一构建高薪竞争力

全栈开发作为现代Web开发的核心模式,涵盖了从前端用户界面到后端服务器、数据库及业务逻辑的完整技术栈。其原理在于通过掌握多种技术协同工作,实现从需求到产品的端到端交付能力。这项技术的价值在于培养开发者对软件系统全局的深刻理解,形成完整的技术闭环,从而在就业市场获得更强的独立性和竞争力。在应用场景上,全栈技能尤其适合中小型企业、创业公司以及个人项目孵化,能够独立完成产品从设计到部署的全过程。本文以构建一个博客系统为例,详细拆解了全栈开发的学习路径,并提供了基于Node.js和Express的实战代码示例,帮助

weixin_34133829的博客 534

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Day.js 完整指南:轻量级日期时间处理库

Day.js是一个轻量级(仅2KB)的JavaScript日期处理库,兼容Moment.js API但体积更小。它支持日期解析、格式化、计算和比较,具有不可变性特点,所有操作返回新实例。核心功能包括:多种日期创建方式、灵活格式化、日期计算与比较、时区处理等。通过插件系统可扩展RelativeTime、UTC等高级功能。相比Moment.js,Day.js更轻量、性能更好,支持tree-shaking。最佳实践包括按需引入插件、复用实例、正确处理时区和月份索引(0-11)。适用于需要高效处理日期时间的前端项目

油墨香^-^的博客 2208

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

nodejs-day1——模块、第三方包管理

可以下载nvm进行node版本切换。

weixin_59017683的博客 462

Node-Day01初识Node.js

Node.js

qq_59099003的博客 220

Day.js 常用方法 以后再也不用new Date( )啦

文件大小只有2KB左右,下载、解析和执行的JavaScript更少,为代码留下更多的时间。而且更好的支持node、浏览器、小程序、ts 的各种环境。而且更好的支持node、浏览器、小程序、ts 的各种环境。我们利用手写的时间 去学习和研究一些其他的功能 岂不是乐乐而不为​ 本文列举了一些 工作中常用的方法作参考 你想了解更多可以去 Day.js官网

^_^ 4787

day.js和Monment.js的一些区别及其常用API

dayjs是一个轻量的处理时间和日期的 JavaScript 库; github地址; 文档地址 Moment 被设计为在浏览器和 Node.js 中都能工作,文档地址,使用方法大同小异 dayjs的优势: 1.和Moment.js有着相同的API和模式(Moment.js地址:http://momentjs.cn/); 2.不可变、持久性 3. 提供链式调用 4. 国际化标准 5.超小的压缩体积,仅仅有2kb左右(Moment.js压缩后大概有16.7k的样子) 6.极大多数的浏览器兼容 npm安装: n

add-oil的博客 6021

如何用js获取当前日期(dayjs的使用)

要在您的 Node.js 项目中使用 Day.js,只需使用 npm安装或 cnpm安装或 yarn安装或 pnpm安装。

PowerYellow1的博客 3174

node.js day1 -- day4 express框架的使用

什么是node.js node.js和JavaScript不完全相同 执行方法 D:\study\VSCODE代码\node> node day1.js //node 后面加js文件名

qq_48942961的博客 371

Day.js 日期格式化

要在您的 Node.js 项目中使用 Day.js或或安装或安装然后在项目代码中引入即可组件库默认支持 dayjs 进行日期时间处理,所以可以直接导入使用在 NPM 包中已经包含 Day.js 的 TypeScript 类型定义文件。通过 NPM 安装在 TypeScript 项目中导入并使用如果您的包含以下配置,您必须使用如果您没有上述配置,default import 将无法正常工作。您需要使用。

lou15516575959的博客 1755

JavaScript日期处理不再难!Day.js带你飞!

表达数字日历日期并消除歧义的标准方法是国际标准化组织(ISO)日期格式。可以使用JavaScript日期方法,它以ISO格式返回新形成的日期,以确认此格式。我们首先了解了Day.js及其使用它格式化时间和日期的好处。Day.js简单地替代了Moment.js。虽然Moment.js不是必需的,但Day.js提供了所有日期格式化、解析、插件和本地化要求。因此,可以使用 dayjs.org 在官方Day.js网站上选择并查找更多信息。

粉丝们务必加入微信粉丝群 2367

八、Express框架 安装

本篇时关于Express框架安装的过程,有全局安装和局部安装,对于Express框架的就不进行过多介绍,Express官方对该框架的定位是:"基于Node.js平台,快速、开放、极简的 Web 开发框架",本篇开始记录关于 Node.js 轻量级Web开发框架。

灵魂学者的博客 7614

前端中 dayjs 时间的插件使用(在vue 项目中)

dayjs

阿乐的博客 852
上一篇: 二二(Node1)、fs(readFile、writeFile)、path(join)、http(createServer)、querystring、端口、web
下一篇: 二四(Node3)、Webpack打包、开发服务器dev、开发模式 生产模式、解析别名路径
bpmf_fff
博客等级 码龄6年 219粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值