zf-6-npm和node (7天)

本文介绍了Node.js的基础知识,包括简单的数学运算、进制转换、编码方式,深入探讨了Buffer对象及其方法。还讨论了Node.js的文件系统操作,如读写文件、删除文件,并简述了模板引擎和事件循环的概念。此外,文章详细讲解了npm的使用,包括安装、版本管理、脚本和发布包的过程。
摘要由CSDN通过智能技术生成

简单强行记忆的。

0.1+0.2 > 0.3

答: 因为小数在计算机里存储为2进制的时候,算法是乘2取整。导致最后会多大一点.所以两个相加综合就大于了0.3了。

进制转化的两种方法。

toString
parseInt(‘0xff’, 16) 任何进制转为16进制。

两种编码base64 和 utf8
Buffer

alloc
from
buffer.slice()
buffer.copy
buffer.concat
buffer.isBuffer
buffer.length
buffer.toString(‘base64’)
buffer.slice
buffer.fill
buffer.split

fs

readFile writeFile 64K以下
fs.copyFile
fs.writeFileSync(‘1.js’, ‘123’); // 如果文件不存在会先创建,如果文件已经存在,会将文件中的内容清空
fs.existSync
fs.access
fs.rename
fs.unlink

read write

文件相关的

mkdir
remdir
readdir
fs.stat

文件的删除一般对用广度遍历,比较简单。
require('./1.review');

// 浏览器打断点 webpack


let Event = require('events')
let e = new Event
# review
## 数组方法reduce
- compose方法 (组合)
- reduce  数组不能为空 如果指定了prev数组里只有一项可以直接把当前prev返回
- map(可以映射成一个新的数组)  
- filter 过滤如果返回false会将这一项过滤掉
- some 如果返回的值有true 就返回true ,every
- find 如果返回true 就会把当前项返回,如果无法找到返回undefined

## 数据结构
- 队列(事件环) 、栈(代码执行) 
- 链表(查找快 删除和添加非常方便,双向链表)
- 集合、hash表(set  map(取的速度快))
- 树(二叉树)树的遍历、图

## 装饰器的应用  @class 修饰方法的时候
- 装饰模式:不改变原有状态,在访问原来函数之前做一一系列操作
- AOP
- 重写原型方法 
```javascript
let oldProto = Array.prototype; // 保留数组原有的原型
let proto = Object.create(oldProto); // 创建了一个新proto
['push','unshift','shift'].forEach(method=>{
   
    proto[method] = function(...args){
   
        update();
        oldProto[method].call(this,...args);
    }
})

function observer(obj){
    // 只将我们传入的数组中的方法重写
    if(Array.isArray(obj)){
   
        obj.__proto__ = proto
    }
}
observer(arr);
arr.push(1);
console.log(arr);
[].push(4,5,6)

模板引擎实现原理 (最简单的正则替换)

    1. with语法 2) new Function 将字符串转化成函数 3) 字符串拼接

浏览器事件环 & node事件环 (js执行的属性)

微任务: promise.then ,MutationObserver,process.nextTick

宏任务:script ,ajax , 事件,requestFrameAnimation, setTimeout ,setInterval ,setImmediate (ie下),MessageChannel ,I/O ,UI rendering。

每执行一个宏任务 就会清空微任务队列

    ┌───────────────────────┐
┌─> │        timers         │ 本阶段执行setTimeout() 和 setInterval() 
│   └──────────┬────────────┘      ┌───────────────┐
│   ┌──────────┴────────────┐      │   incoming:   │
│   │poll    (可能会在某些时候进行阻塞)│  <───┤  connections, │ 获取新的 I/O 事件,查找已经到时的定时器
│   └──────────┬────────────┘      │   data, etc.  │
│   ┌──────────┴────────────┐      └───────────────┘
│───│        check          │ setImmediate()
    └───────────────────────┘

node中的全局对象

  • process process.argv / process.env / process.platform / process-nextTick
  • Buffer 缓存 二进制数据
  • setImmediate 立即
  • require exports module __filename __dirname (每个文件外面都会增加函数)

node中的模块 (debug源代码)

模块分类: ES6module 静态导入(import()),commonjs规范 (动态导入) amd,cmd,umd

commonjs规范

  • 一个文件就是一个模块
  • 如果模块想给别人使用 module.exports / exports 同一个对象但是最终导出的是module.exports
    • module.exports = {}
    • exports.a = 1;
    • module.exports.a = 1;
    • global
  • 如果想使用这个模块 require

–inpsect-brk (chrome://inspect/#devices)

规范其实给exports赋值 默认获取到的就是exports结果

node中模块的分类

  • 核心模块 require(‘moduleName’)
    • fs fs.readFileSync ReadFile fs.existsSync fs.access
    • vm vm.runInThisContext
    • path path.resolve() join extname basename dirname (process.cwd())
    • util util.inherits util.promisify (转化成promise) async + await
    • events on(addListener) once(绑定依次) off(关闭绑定) newListener emit
    • 发布订阅优势 解耦合
  • 文件模块/自定义模块 (同步读取文件,包一个自执行函数,vm.runInthisContext,传入export对象,最终返回的是exports 对象,所以就可以拿到其他模块的内容)
  • 第三方模块 module.paths
    • commander , chalk , mime 1.jpg

如果文件和文件夹重名 先取文件,文件不能取到,找文件夹 package.json => main => index.js

npm使用

安装

  • 全局安装 (bin)
  • 本地安装

版本问题

npm采用了semver规范作为依赖版本管理方案。semver 约定一个包的版本号必须包含3个数字

  • MAJOR 对应大的版本号迭代,做了不兼容旧版的修改时要更新 MAJOR 版本号
  • MINOR 对应小版本迭代,发生兼容旧版API的修改或功能更新时,更新MINOR版本号
  • PATCH 对应修订版本号,一般针对修复 BUG 的版本号
range 含义
^2.2.1 指定的 MAJOR 版本号下, 所有更新的版本 匹配 2.2.3, 2.3.0; 不匹配 1.0.3, 3.0.1
~2.2.1 指定 MAJOR.MINOR 版本号下,所有更新的版本 匹配 2.2.3, 2.2.9 ; 不匹配 2.3.0, 2.4.5
>=2.1 版本号大于或等于 2.1.0 匹配 2.1.2, 3.1
<=2.2 版本号小于或等于 2.2 匹配 1.0.0, 2.2.1, 2.2.11
1.0.0 - 2.0.0 版本号从 1.0.0 (含) 到 2.0.0 (含) 匹配 1.0.0, 1.3.4, 2.0.0

预发版:

  • alpha(α):预览版,或者叫内部测试版;一般不向外部发布,会有很多bug;一般只有测试人员使用。
  • beta(β):测试版,或者叫公开测试版;这个阶段的版本会一直加入新的功能;在alpha版之后推出。
  • rc(release candidate):最终测试版本;可能成为最终产品的候选版本,如果未出现问题则可发布成为正式版本。

scripts

  • 执行可执行命令 npm run

npx

  • 执行.bin目录文件

发布包

  • npm publish

课程安排

  • buffer
  • fs

```javascript
let r = [].reduce((memo)=>{

},[])



function coffee(){
    console.log('苦咖啡')
}

function sweetCoffee(){
    coffee();
    console.log('加糖')
}
function milkCoffee(){
    coffee();
    console.log('加牛奶')
}


// vue里我希望调用数组的方法 实现视图的更新
// arr[0] = 123;
// push , shift ,unshift
const update = ()=>{
    console.log('更新')
}

let arr = [];

let oldProto = Array.prototype; // 保留数组原有的原型
let proto = Object.create(oldProto); // 创建了一个新proto
['push','unshift','shift'].forEach(method=>{
    proto[method] = function(...args){
        update();
        oldProto[method].call(this,...args);
    }
})

function observer(obj){ // 只将我们传入的数组中的方法重写
    if(Array.isArray(obj)){
        obj.__proto__ = proto
    }
}
observer(arr);
arr.push(1);
console.log(arr);
[].push(4,5,6)


console.log(module.paths)
buffer
buffer-encoding.js
let fs = require('fs');
let path = require('path');
let r = fs.readFileSync(path.resolve(__dirname,'note.md'));
// 默认文件读取操作 读取出来的都是buffer
// 内存表示方式就是buffer 内存二进制的 十六进制 八进制  十进制
// 进制转化问题 0.1 + 0.2 != 0.3  我们需要将值存到内存中 保存的时候存储的是二进制
console.log(r);

// 0.0001100110011001100110011001100110011001100110011001101
// 0.001100110011001100110011001100110011001100110011001101

// 进制转化 小数 *2 取整法
// 0.1 * 2 = 0.2 =>0 
// 0.2 * 2 = 0.4 =>0
// 0.4 * 2 = 0.8 =>0
// 0.8 * 2 = 1.6 =>1
// 0.6 * 2 = 1.2 =>1
// 0.2 * 2 = 0.4 =>0 
// 0.4 * 2 = 0.8 =>0
// 0.8 * 2 = 1.6 =>1

// 整数 进制转化 基于编码
// ASCII(美国) 默认 就一个一个字节来表示是一个字母或者符号
// 1个字节 有8个bit 最大 是 8个1 =》 10进制 255
// 默认 字母 常见符号 \r \n

// gb2312 第一位大于127的我认为+ 第二位 就是一个中文 255 - 127 * 255
// GB18030
// gbk
// 用两个字节来表示中文

// unicode => utf8
// 课表长度 如果是中文采用3个字节来表示,node里默认值支持utf8格式,可以采用别的模块来实现

// 将10进制 转化成其他进制 255 0xff 0b 0o
console.log((0xff).toString(2)); // 值变成了字符串
// 进制转化 将任意进制转化成10进制
console.log(parseInt('0xff',16));

// base64 二进制的值不能超过64  (核心就是进制的转化)
// base64 可以反姐    加密 加密后可以特殊的人解密

// 在浏览器header中吗。任意的url中都可以采用base64,前端实现文件预览 fileReadReader
// 转码后的结果 比原来的内容 大

// 如果一个汉字
console.log(Buffer.from('珠')); // e7 8f a0
console.log(0xe7.toString(2));
console
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值