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

Node.js基础

Node.js

基于Chrome的V8引擎的JavaScript 运行环境

如何使用Node.js

1.在官网下载Node.js https://nodejs.org/en/,然后在电脑中安装
2.在终端中查看Node.js的版本

node -v

3.新建一个js文件 ,例如:创建了一个myNode.js文件
4.在终端运行

// node js文件名字
node myNode.js

Nodejs中的模块

模块化: 解决一个复杂问题,自顶向下逐层把系统划分为若干模块的过程,模块是可组合,分解和更换的单元。
Node.js遵守了 CommonJS模块规范

CommonJS 规定了模块特性和各模块之间如何相互依赖:

  1. 每个模块内部,module变量代表当前模块
  2. module变量是一个对象,它的exports属性(即module.exports) 是对外的接口
  3. 加载某个模块,其实是加载该模块的module.exports属性,require()方法用于加载模块

模块化的优点

  1. 提高了代码复用性
  2. 提高了代码可维护性
  3. 可以实现按需加载

模块作用域

模块内定义的变量、方法等成员,只能在当前模块内被访问这种限制叫做模块作用域,避免了全局污染

模块的分类

1. 内置模块

加载模块通过require(内置模块名字) 省略.js后缀名

fs文件系统模块

1.加载fs模块

const fs = require('fs')

2.使用fs.readFile读取文件内容

fs.readFile('./01.txt', 'utf8', function(err,data){
    // 失败结果
    console.log(err)
    // 成功结果
    console.log(data)
})

3.使用fs.writeFile写入内容到文件中,会覆盖文件写入前内容

fs.writeFile('./01.txt','这是通过fs写入的文件内容','utf8', function(err){
    // 失败结果
    console.log(err)
})
path模块

提供了一些工具函数,用于处理文件与目录的路径。

fs.readFile('../01.txt', 'utf8', function(err,data){}

./ 或以 …/ 开头为 相对路径,node命令会动态拼接当前相对路径 ,当我们在文件路径的上一层或其他目录运行时,拼接的路径就不正确。
此时就需要使用绝对路径,在项目中不可能写死一个绝对路径,path模块就提供了解决该问题的相关办法。
1.加载模块

const path = require('path')

__dirname 表示当前文件所处的目录
2.使用path.join可以把多个路径拼接在一起

// 可在任何目录执行当前js,都能通过文件目录正确找到
fs.readFile(path.join(__dirname,'./01.txt'), 'utf8', function(err,data){})

注意:拼接../会抵消一个路径
例如 :

path.join('E:\\node\\my\\01.txt','../','./01.txt')
//得到的路径是 E:\node\01.txt

3.使用path.basename获取文件名

const fpath = '/a/a/b/index.html'
const fullname = path.basename(fpath)
console.log(fullname) // index.html
//只获取名字,不要后缀名
const name = path.basename(fpath,'.html')
console.log(name)  //index

3.使用path.extname获取文件名

const lastpath = path.extname('/a/a/b/index.html')
console.log(path.extname(lastpath)) // .html
http模块

1.导入http模块
2.创建web服务器实例
3.为服务器绑定request事件 监听客户端请求
4.启动服务器

//index.js
//启动当前js文件 就可在浏览器通过http://127.0.0.1:80访问
const http =  require('http')
const server = http.createServer()
server.on('request',(req,res)=>{
	//访问一次就会打印一次
    console.log('有人访问')
})
server.listen(80,() => {
    console.log('开启服务 http://127.0.0.1:80')
})

回到调函数(req,res)=>{}中第一个参数req为请求对象,第二个res参数为请求响应对象
可通过req.url获取请求地址,req.method获取请求方式
在上面index.js中,访问http://127.0.0.1:80在node终端会打印,但浏览器中是一个空白页面。
可以通过res.end()向页面返回指定的内容,如果内容包含中文需要设置res.setHeader('Content-Type','text/html; charset=utf-8',)防止乱码。

//部分代码
server.on('request',(req,res)=>{
    const str = `请求的客户端是 ${req.url},method是 ${req.method}`
    console.log(str)
    let content = '<h4>404 Not found</h4>'
    const url = req.url
    if(url === '/' || url === '/index.html') {
        content = '<h4>首页</h4>'
    }else if (url === '/about.html') {
        content = '<h4>关于页面</h4>'
    }
    res.setHeader('Content-Type','text/html; charset=utf-8',)
    res.end(content)
})
//在index.js加入这些代码,访问服务器就会就会得到url在服务器返回的对应内容

在index.js中 server.listen(80,() => {console.log('开启服务http://127.0.0.1:80')})80是端口号,127.0.0.1代表自己的电脑 对应localhost
补充知识点:
1.域名和IP是一一对应关系 存放在域名服务器
2.端口号:一台电脑可以运行多个服务,每个服务对应唯一的端口号

2. 自定义模块

用户创建的每个.js文件都是自定义模块
加载自定义模块使用require(路径加文件名)

3. 第三方模块

第三开发使用需要先下载

npm install 第三方模块名称

加载第三方模块使用require(模块名)

module

module对象存储了和当前模块有关的信息

module.exports 对象 默认为{}

在自定义模块中,可以使用module.exports对象,将模块内的成员共享出去,供外界使用
当使用require()导入时得到的就是module.exports对象

exports对象

exports 和 module.exports 指向同一个对象
永远以module.exports指向的对象为准

模块加载机制

  1. 优先从缓存中加载,模块在第一次加载后会被缓存
    (意味着多次掉require()不会导致模块代码被多次执行)
  2. 内置模块的加载优先级最高

自定模块加载机制

./ …/路径标识符开头
如果require自定义模块 省略了文件扩展名

  1. 按照确切文件明进行加载
  2. 补全.js扩展名进行加载
  3. 不全.json扩展名进行加载
  4. 补全.node扩展名进行加载
  5. 加载失败,终端报错

第三方模块加载机制

没有开头会从当前模块的父目录开始
尝试从/node_modules文件夹中加载第三方模块
没有找到则移动到上一层父目录node_modules 直到文件根目录

目录作为模块
1.找package.json/文件 main属性 作为入口
2.则试图加载index.js文件

npm与包

待更新

Express

待更新

相关文章:

  • STM32无硬件随机数发生器时生成随机数的方法
  • 时序约束实战
  • FL Studio21中文完整版升级下载
  • Netty源码剖析之NIOEventLoopGroup创建流程
  • Python语言学习:Python语言学习之面向对象编程OO(继承封装多态)/类方法/装饰器的简介、案例应用之详细攻略
  • 计算机毕业设计ssm基于java网上心理咨询系统50fxl系统+程序+源码+lw+远程部署
  • 备战数学建模47-数模常规算法之图论(攻坚站12)
  • 算法学习十八补二叉树递归套路+贪心算法一
  • Linux常用命令(上).
  • 叠氮聚乙二醇生物素 N3-PEG-Biotin Azide-PEG-Biotin的结构式
  • Java网络编程1
  • Opencv项目实战:09 物体尺寸测量
  • 记一次vue前端导出excel
  • 缓存预热Springboot定时任务
  • 基于遗传算法的BP神经网络在汇率预测中的应用研究(Matlab代码实现)
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • axios 和 cookie 的那些事
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • Flannel解读
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • Java多线程(4):使用线程池执行定时任务
  • Markdown 语法简单说明
  • mysql外键的使用
  • scrapy学习之路4(itemloder的使用)
  • webpack+react项目初体验——记录我的webpack环境配置
  • Zsh 开发指南(第十四篇 文件读写)
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 通过git安装npm私有模块
  • 我看到的前端
  • 学习ES6 变量的解构赋值
  • 学习笔记:对象,原型和继承(1)
  • 正则表达式小结
  • 带你开发类似Pokemon Go的AR游戏
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • #LLM入门|Prompt#3.3_存储_Memory
  • #NOIP 2014# day.2 T2 寻找道路
  • #考研#计算机文化知识1(局域网及网络互联)
  • (C语言)fgets与fputs函数详解
  • (JS基础)String 类型
  • (二)hibernate配置管理
  • (七)Java对象在Hibernate持久化层的状态
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (一)80c52学习之旅-起始篇
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • *1 计算机基础和操作系统基础及几大协议
  • .net framework 4.0中如何 输出 form 的name属性。
  • .Net Web窗口页属性
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET分布式缓存Memcached从入门到实战
  • .NET应用架构设计:原则、模式与实践 目录预览
  • /*在DataTable中更新、删除数据*/
  • @DataRedisTest测试redis从未如此丝滑
  • [1127]图形打印 sdutOJ