node基础知识

news2024/11/17 11:46:18

node基础知识

node在真实项目中的应用

webpack基于node环境 用nodejs的语法合并压缩打包

d19d19b165585aeaa97dea744829d8a7.png

js放到客户端浏览器中执行

放到服务器端运行:java因为jdk php因为tomcat c#因为有.net framework

9c76006e35ffe2093d93b0a2500206ef.png

项目架构1:中小型项目-基于nodejs构建全栈

项目架构2:大型项目

其他作用:

客户端和nodejs在同一个域下,实现跨域传输

项目架构3

node和浏览器的区别

文件的读写

I/O:指的是对文件的读写

I:写

O:读

window & global*

window提供的内置属性和方法:

  • navigation
  • location
  • alert
  • window.open / window.setTimout / window.setInterval
  • window.getComputedStyle / window.requestAnimationFrame
  • JSON.parse / JSON.stringify

node环境:

  • process
  • buffer
  • setImmediate

 25ef033e8b7cfbfb5a63296410bbce41.png

this

文件中的this是当前模块

比如jQuery中区分了node和浏览器

复习和加深npm的使用

npm i

开发和生产依赖

webpack:合并压缩打包

比如less:部署到服务器上的时候 需要less吗?不需要了。部署到的是css

axios:开发/生产都需要

生产依赖:开发需要,生产也需要

开发依赖:只有开发需要

bd977c5dad0ae7bad50da639574452a0.png

全局 & 本地

全局:为了用命令

本地:require进来导入到文件中使用

环境变量*

process.env env存储的是node的全局环境变量

commonjs模块规范

模块管理机制

一个模块一定有导入/导出,创建和导入导出

node中都是按模块按规定的

核心模块

qs:把对象转换成x-www-form-urlencoded格式

node是基于commonjs模块管理思想,如何创建和导入/导出模块

node中的模块管理

每创建一个js就是创建一个模块

其实之前讲的:其实每一个单例模式就是一个单独的模块

  1. 互不冲突
  2. module.exports 暴露给外部使用的

创建:创建一个js就是创建一个模块

导出:module.exports

导入:require

调取模块:相当于把模块中的js代码从上到下执行了一遍

例子:

function sum(){
    let total=0;
    total=[].reduce.call(arguments,(total,item,index)=>{
       total +=item;
       return total;
    },0)
    return total;
}
// console.log(sum(1,2,3,4,5))
module.exports={
    sum
}

const a=require('./a')
function avg() {
    let sum=0,max=Math.max(...arguments),min=Math.min(...arguments);
    sum=a.sum(...arguments)
    sum-=max;
    sum-=min;
    return sum/(arguments.length-2);
}
// console.log(avg(1,2,3,4,5))
module.exports={
    avg
}

const {avg}=require('./b')

console.log(avg(1,2,3,4,5));

fs模块中的方法

fs:提供大量方法赋予js在node环境下有操作文件的能力

node单线程异步:提供的大部分都是异步

fs.readdir()

回调函数机制,即事件驱动方式

相对或绝对路径

相对:./ 或者 ../

绝对:带磁盘符

d42cd2c5e779b9f02396e63cc712c539.png

读取文件*

buffer:默认读到了文件流。buffer涉及到进制转换、流那些知识点,node高级知识点。类似于进制编码的格式。

13e896d8fa2be45730e1ef3d194adf52.png

富媒体资源文件:图片、音视频等

图片:不是json、html格式文件有自己的代码,是通过自己的机制组合起来。

文件有2种:

  1. 自己创建一个文件,自己写内容写代码的,通过utf-8去读。
  2. 富媒体用buffer去读。

拷贝文件

fs.readFile

fs.writeFile

fs.unlink // 删除

fs.copyFile

fs.appendFile

fs.readdir

fs.mkdir

fs.rmdir

封装成promise版

在executor中执行一个异步操作,通过resolve或reject 来通知then执行还是catch执行

路径问题

你执行node命令的目录为根目录,而不是以你文件的目录

开发都用绝对路径

__dirname:当前模块所在的绝对路径

path.resolve()

获取的是:当前node执行时所在的目录,作为当前根目录的绝对路径

const fs=require('fs');
// function readFile(pathname) {
//     return new Promise(((resolve, reject) => {
//         let encoding='utf8'
//         // 富媒体资源不用utf8编码
//         if(/\.(png|jpg|jpeg|mp3|mp4)$/.test(pathname)){
//             encoding=null;
//         }
//         fs.readFile(pathname,encoding,(err,result)=>{
//             if(err) {
//                 return reject(err)
//             }
//             resolve(result)
//         })
//     }))
// }
const fileObj={}
['readFile','readdir','mkdir','rmdir','unlink'].forEach(item=>{
    fileObj[item]=function (pathname) {
        let encoding='utf8'
        // 富媒体资源不用utf8编码
        if(/\.(png|jpg|jpeg|mp3|mp4)$/.test(pathname)){
            encoding=null;
        }
        // pathname=path.resolve(pathname)
        return new Promise((resolve, reject) => {
            let callback=(err,result)=>{
                if(err) return reject(err)
                resolve(result)
            }
            if(item==='readFile'){
                encoding=callback;
                callback=null;
            }
            fs[item](pathname,encoding,callback)
        })



    }
})

module.exports={
    readFile
}

基于fs完成css合并压缩*

fs的IO操作:文件或文件夹的增删改查

const {readFile,readdir}=require('./promiseFile')
const path=require('path');
const fs=require('fs');
const less=require('less')


async function readCss(){
    let results= await readdir(path.resolve(__dirname,'./css'))
    results=results.filter(filename=>/\.css/.test(filename))
    results=await Promise.all(results.map(filename=>readFile(path.resolve(__dirname,`./css/${filename}`))))
    let cssContent=results.join('')
    // 写入total.css
    fs.writeFile(path.resolve(__dirname,'./dist/total.css'),cssContent,()=>{})
    // 压缩css
    less.render(cssContent,{compress:true},(err,{css})=>{
               fs.writeFile(path.resolve(__dirname,'./dist/total.min.css'),css,()=>{})
    })
}
readCss()


URL和HTTP模块

协议默认端口号

http:80

https:443

ftp:21

http:

创建服务,接受客户端请求,给客户端返回结果。

输入网址按下enter键:

域名解析->dns解析->tcp3次握手->发请求 服务器上有一个服务接收请求。如IIS nginx

返回结果->客户端渲染-> 断开tcp连接

0-65535

  1. http.createServer
  2. server.listent(80,...)

createServer 回调:有请求过来时

const http=require('http')
let server=http.createServer((req,res)=>{
    res.end('hello world')
})
server.listen(8080,()=>{
    console.log('server is listening on port 8080!!!')
})

可能返回的资源文件路径

  1. 根据suffix区分资源路径和数据接口
  2. 富媒体走buffer 不按charset=utf8

const http=require('http')
const path=require('path');
const url=require('url');
const mime=require('mime');
const  {readFile} =require('./promiseFile.js')
let server=http.createServer((req,res)=>{
    // res.end('hello world')
    let {url:requestUrl}=req;
    let {pathname}=url.parse(requestUrl);
    pathname=path.resolve(__dirname,`./static${pathname}`)

    const suffixReg=/\.(\w+)$/,richReg=/\.(png|jpg|jpeg|mp3|mp4)$/;
    let suffix=suffixReg.test(requestUrl)?suffixReg.exec(requestUrl)[1]:null;
    let encoding=richReg.test(requestUrl)?'charset=utf8':'';
    if(suffix){
        readFile(pathname).then(result=>{
            res.writeHead(200,{
                'Content-Type':`${mime.getType(suffix)};${encoding}`
            })
            res.write(result);
            res.end()
        }).catch(()=>res.end('not found'))
    }



})
server.listen(8080,()=>{
    console.log('server is listening on port 8080!!!')
})

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/160409.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mysql转DM达梦数据库+springboot兼容DM数据库+springboot兼容activity5.22.0

由于现在做的项目中需要针对数据库进行国产化操作,最终完成从mysql到达梦的迁移,记录整合迁移记录如下:安装初始化达梦数据库(傻瓜式安装即可)安装达梦数据库(windows、linux)初始化数据库实例关…

代码质量与安全 | 新时代:2023年商业软件开发的五大关键目标

进入2023年,技术趋势仍然聚焦于人工智能、边缘智能和气候变化领域,但供应链增速放缓和日益增长的消费者需求阻碍着创新的步伐。为了在行业中保持竞争力,并实现软件工程预定目标,软件开发领导者需要主动制定预算和时间管理计划&…

Java设计模式-模板模式Template

介绍 模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),z 在一个抽象类公开定义了执行。它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。简单说&#xff…

中移链合约常用开发介绍 (二)多索引表的使用

一、目的本文详细介绍了开发、部署和测试一个地址簿的智能合约的流程,适用于EOS的初学者了解如何使用智能合约实现本地区块链上数据的持久化和对持久化数据的增删改查。二、智能合约介绍区块链作为一种分布式可信计算平台,去中心化是其最本质的特征。每笔…

17.Isaac教程--机器学习流程

机器学习流程 ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 文章目录机器学习流程模拟训练PC 和边缘设备上的推理使用 TensorRT 进行推理Torch推理使用 Tensorflow 进行推理示例PyCodelet配套代码Tensorflow 推理小码TensorRT 推理小码SampleAc…

23种设计模式(三)——模板方法模式【组件协作】

文章目录意图什么时候使用模板方法真实世界类比常说的钩子模板方法的实现模板方法模式的优缺点亦称: Template Method 意图 它的主要思想是,定义一个操作的一系列步骤,对于某些暂时确定不下来的步骤,就留给子类去实现好了&#x…

位图与矢量图的区别

相信大家在日常的工作过程中,经常会听到位图和矢量图,那么位图和矢量图的区别是什么呢? 1.定义 ①位图:称为点阵图像或栅格图像,是由称作像素(图片元素)的单个点组成的。这 些点可以进行不同的排…

测试用例设计方法有哪些?举例说明

众所周知,测试用例是编制的一组测试输入、执行条件及预期结果,专门为的是某个特殊目标,即测试某个程序路径,或是核实是否满足某个特定的需求。一般来讲,常用的测试用例设计方法有五种,分别是:正…

微信小程序中如何实现双向绑定

一、双向绑定 在微信小程序中如何实现双向绑定?在开始之前先介绍下什么是双向绑定,js中定义变量数据后,通过{{}}绑定到模板中,这个过程是单向绑定,即数据的更新只能是js中更新了数据,模板中跟着修改。但是如…

深度学习笔记:神经网络(3)

关于本章之前内容可以参考以下之前文章: 1 https://blog.csdn.net/Raine_Yang/article/details/128473486?spm1001.2014.3001.5501 2 https://blog.csdn.net/Raine_Yang/article/details/128584916?spm1001.2014.3001.5501 神经网络的输出层设计 机器学习问题一般…

2022年12月青少年软件编程(Python) 等级考试试卷(三级)

2022. 12 青少年软件编程(Python) 等级考试试卷(三级) 一、 单选题(共 25 题, 共 50 分) 1.列表 L1 中全是整数, 小明想将其中所有奇数都增加 1, 偶数不变, 于是编写了如下图 所示的…

高级树结构之平衡二叉树(ALV树)

文章目录平衡二叉树简介失衡类型&处理办法RR型失衡【左旋调整】调整演示代码实现LL型失衡【右旋调整】调整演示代码实现RL型失衡【先右旋后左旋调整】调整演示代码实现LR型失衡【先右旋后左旋调整】调整演示代码实现插入操作综合代码演示平衡二叉树简介 在数据有序的情况下…

Codeforces Round #842 (Div. 2)

Codeforces Round #843 (Div. 2) 传送门 不想搞的很累&#xff0c;对自己不做要求&#xff0c;有兴趣就做。 A. Greatest Convex #include <bits/stdc.h>using namespace std; const int maxn 1e6 10; vector<int> cnt[maxn]; map<int, int> mp;int mai…

nvm安装 疑难问题解决

nvm介绍 NVM是node.js的版本管理器&#xff0c;设计为每个用户安装&#xff0c;并在每个shell中调用。nvm可以在任何兼容posix的shell (sh、dash、ksh、zsh、bash)上运行&#xff0c;特别是在这些平台上:unix、macOS和windows WSL。 nvm安装 &#xff01;&#xff01;重要&a…

强化学习在智能补货场景的应用

本文作者&#xff1a;应如是&#xff0c;观远算法团队工程师&#xff0c;毕业于伦敦帝国理工学院计算机系&#xff0c;主要研究方向为强化学习、时间序列算法及其落地应用。深耕零售消费品场景&#xff0c;解决供应链运筹优化问题。为客户提供基于机器学习的AI解决方案。1. 背景…

2023.Q1 go语言记录

1. Go 语言数组声明和初始化var variable_name [SIZE] variable_type&#xff0c;eg&#xff1a;var balance [10] float32var balance [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}balance : [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}长度不确定的初始化var balance [...]float…

少儿Python每日一题(21):八皇后问题

原题解答 本次的题目如下所示: 会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。 对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即,…

【Ansible】Ansible Playbook 的任务控制

Ansible Playbook 的任务控制 文章目录Ansible Playbook 的任务控制一、Ansible 任务控制基本介绍二、条件判断1.解决第一个问题2.nginx 语法校验三、循环控制四、Tags 属性五、Handlers 属性一、Ansible 任务控制基本介绍 任务控制类似于编程语言中的 if …、for …等逻辑控制…

MSF社会工程学

● Metasploit发现两个远程代码执行漏洞 ○ 问题都出在WEB组件方面 ○ MSF不受影响 ● 安全面前任何软件都是平等的 ○ 没有绝对安全的软件 为什么要说社会工程学 ● Metasploit可以很好的配合到社会工程学攻击的各个阶段 ● Setoolkit工具包大量依赖Metasploit ● 基于浏览器…

[SUCTF 2019]EasySQL

目录 预先知识 信息收集 思路 源码分析 非预期解 预期解 补充 预先知识 环境 use mysql; create table if not exists my_table( id int PRIMARY key auto_increment, name VARCHAR(20), age int); insert into my_table values(NULL,xiao,19); insert into my_table v…