自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

俞华的博客

学习、专注,永无止尽

  • 博客(202)
  • 收藏
  • 关注

原创 5.pkg-dir源码解析

5.pkg-dir源码解析从某个目录开始向上查找,直到找到存在package.json的目录,并返回该目录。如果未找到则返回null使用const pkgDir = require('pkg-dir');const globalDir = pkgDir.sync(path.dirname(filename));源码'use strict';const path = require('path');const findUp = require('find-up');modul

2021-06-01 19:10:12 383 2

原创 Vue-Router核心原理实现(文末附手写版源码)

VueRouter的核心原理一、VueRouter的核心组成部分主要实现以下几部分:modethis.router/this.router/this.router/this.routerouter-link/router-viewVue.use注册插件1、mode在vueRouter中,主要分为两种模式,一种是hash,一种是history。hash模式是通过监听...

2020-01-01 18:24:38 672 2

原创 一文读懂V8垃圾回收机制——新生代Scavenge、老生代Mark-Sweep和Mark-Compact

1 V8内存管理1.1 V8n内存限制64位系统可用1.4G内存32位系统可用0.7G内存1.2 V8内存管理JS对象都是通过V8进行分配管理内存的process.memoryUsage()返回一个对象,包含了Node进程的内存占用信息 console.log(process.memoryUsage()); //结果如下: { rss:...

2019-12-29 22:47:34 3185

原创 【docker】学docker,看此文真的足够了!

一、image镜像1.1 查看镜像 docker image ls字段含义REPOSITORY仓库地址TAG标签IMAGE_ID镜像IDCREATED创建时间SIZE镜像大小1.2 查找镜像 docker search ubuntu字段含义NAME名称DESCRIPTION描述...

2019-08-06 06:24:24 656

原创 2.ES6-解构赋值及其原理-解构看完这篇足够了

所谓的解构赋值其实就是分解出一个对象的解构,分成两个步骤: 1. 变量的声明 2. 变量的赋值一、 数组的解构赋值/* 对于数组的解构赋值,其实就是获得数组的元素,而我们一般情况下获取数组元素的方法是通过下标获取,例如: let arr = [1,2,3]; let a = arr[0]; ...

2018-08-08 00:21:20 13141 1

原创 N年前写的微前端笔记——微前端技术架构

2021-09-29 20:14:17 180

原创 N年前写的微前端笔记——如何使用history插件管理浏览记录(六)

本文介绍如何使用history插件管理浏览记录history插件的使用history这个插件可以方便管理你的浏览记录cnpm install history --saveimport createHistory from 'history/createBrowserHistory'三种方法有三种使用方式 createBrowserHistory 现代浏览器使用 createBrowserHistory({ basename: ...

2021-09-29 20:10:23 281

原创 N年前写的微前端笔记——微前端懒加载(五)

微前端懒加载根据前面所讲,我们知道需要加载一个应用,就是去正确注册并启动这个应用,总共有两个步骤:注册 registerApp({ name: config.name, main: config.main, url: config.prefix, store: config.store, base: config.base, path: config.path, })启动 singleSpa.start();

2021-09-29 20:09:05 182

原创 N年前写的微前端笔记——4.消息总线-微前端应用之间的通信工具(四)

7.消息总线其实微前端,就是将每个app装入了自己的黑匣子中,与外界相对隔离,相互之间无法通信,这其实与我们的现实并不符合。所以,微前端应用之间的相互通信,成了微前端架构的关键之一。应用之间的通信,可以分为两类:每个黑匣子里面发生了什么,外面如何知道?每个黑匣子都是有生命周期的,当被卸载的时候,外面如何知道你已经被卸载了,卸载后又如何保证正常的通信?解决方案github上的single-spa-portal-example提供了解决方案。该方案是基于redux的。pre.了解

2021-09-29 20:07:35 210

原创 N年前写的微前端笔记——模块加载器批量注册应用(三)

6.模块加载器这里的模块加载器,其实主要就是通过汇集每个应用的配置文件,批量注册应用配置文件在每个应用下新建配置文件,比如在src/vue下新建config.jsexport default { "name": "vue", //模块名称 "path": "/vue-project", //模块url前缀 "prefix": "/vue", //模块文件路径前缀 "main": "vue/vue.app.js", //模块渲染出口文件 "store": "./src/vu

2021-09-29 15:01:40 223

原创 N年前写的微前端笔记——demo-感受Single-Spa(二)

5. 感受Single-Spa我们先通过小demo,来感受下Single-Spa如何实现一个项目两个框架同时存在的开始创建根目录mkdir single-spa-appcd single-spa-app初始化项目npm init -y安装依赖,直接展示package.json上的依赖吧dependencies 用 “npm i 依赖名” 来安装devDependencies 用 “npm i 依赖名 -D” 来安装"dependencies": { "r

2021-09-29 15:00:19 184

原创 N年前写的微前端笔记——初探微前端(一)

微前端是一种类似于微服务的架构,它将微服务的理念应用于浏览器端,即将 Web 应用由单一的单体应用转变为多个小型前端应用聚合为一的应用。各个前端应用还可以独立运行、独立开发、独立部署。1.后端微服务与前端微服务的优势有何相似之处优势后端微服务前端微服务复杂度可控体积小、复杂度低,每个微服务可由一个小规模开发团队完全掌握,易于保持高可维护性和开发效率每一个UI业务模块由独立的前端团队开发,避免代码巨无霸,保持开发时的高速编译,保持较低的复杂度,便于维护,提升开发效率独立.

2021-09-29 14:58:06 166

原创 14.node中的转化流Transform

转换流转化流是一种双工流,继承双工流,能够使得可写流与可读流之间相互转化1. 转换流的实现stream.Transform 类原型上继承自 stream.Duplex 并实现其自己版本的 writable._write() 和 readable._read() 方法。 自定义的 Transform 实现必须实现 transform._transform() 方法,也可以实现 transform._flush() 方法。// 转化流——可以吧可写流转换成可读流,可以用于加密 压缩const

2021-09-13 21:22:53 359

原创 13.node中的双工流Deplex

双工流双工流特点:既可读,又可写。(读写之间可以没有关系)同时实现了 Readable 和 Writable 的流,即可以作为上游生产数据,又可以作为下游消费数据,这样可以处于数据流动管道的中间部分 rs.pipe(rws1).pipe(rws2).pipe(rws3).pipe(ws);1. Duplex实现由于js没有多继承,但又需要继承Readable和Writable,所以就需要继承Duplex类,而这个类继承了Readable和Writableconst { Dup

2021-09-13 21:22:13 268

原创 12.node中的管道流pipe

管道流pipe1. 管道流的使用格式: 可读流.pipe(可写流)const ReadStream = require('./ReadStream')const WriteStream = require('./WriteStream')// rs是一个可读流let rs = new ReadStream('./text.txt', { highWaterMark: 4})// ws是一个可写流let ws = new WriteStream('./copy.txt', {

2021-09-13 21:21:20 565

原创 11. 链表结构和队列

常用的数据结构:队列、栈、链表、树等…队列先进先出,push shift举例: 事件环栈后进先出,push pop举例: 方法调用栈、路由切换、浏览器对而历史记录(两个栈)、判断标签是否闭合1. 栈型结构举例1.1 方法调用栈function a(){ function b(){ function c(){ } c(); } b();}a();错误的说法:每次执行都会创建一个作用域。错误的原因:声明时就定义了作用域,而不.

2021-09-01 21:48:52 176

原创 10.文件可写流fs.createWriteStream

1.可写流createWriteStream的使用1.1 创建可写流const ws = fs.createWriteStream(path.resolve(__dirname, 'test.txt'), { flags: 'w', // 写流不能用r,会报错.可以用'a'表示追加 encoding: 'utf8', // 不写默认是utf8 autoClose: true, // 写完是否自动关闭 // start: 0, //从第几个字节开始写 highWaterMark: 3

2021-09-01 21:29:11 1781

原创 9.流之可读流与文件可读流

可读流与文件可读流1. 流的概念流是一组有序的,有起点和终点的字节数据传输手段它不关心文件的整体内容,只关注是否从文件中读到了数据,以及读到数据之后的处理流是一个抽象接口,被 Node 中的很多对象所实现。比如fs模块就是基于流来写的,HTTP 服务器request和response对象都是流。一般读取大文件的时候才用流,小文件直接fs.readFile就可以了2. 可读流createReadStream2.1 创建可读流let rs = fs.createReadStream(path

2021-08-26 18:07:44 256

原创 8.fs模块知识点

node中常用的fs模块1. fs模块介绍在Node.js中,使用fs模块来实现所有有关文件及目录的创建、写入及删除操作。在fs模块中,所有的方法都分为同步和异步两种实现。具有sync后缀的方法为同步方法,不具有sync后缀的方法为异步方法。2. 整体读取文件2.1 异步读取语法: fs.readFile(path[, options], callback)options: String | ObjectString: ‘utf-8’Object: {encoding: ‘ut

2021-08-25 22:20:43 222 1

原创 7.Buffer知识点

什么是Buffer?缓冲区Buffer是暂时存放输入输出数据的一段内存。Buffer是十六进制。JS语言没有二进制数据类型,而在处理TCP和文件流的时候,必须要处理二进制数据。所以,其实我们的node是把数据从二进制转换成了十六进制NodeJS提供了一个Buffer对象来提供对二进制数据的操作Buffer是一个表示固定内存分配的全局对象,也就是说要放到缓存区中的字节要提前确定Buffer好比由一个多位字节元素组成的数组,可以有效地在javascript中表示二进制数据什么是字节1字节

2021-08-24 21:24:30 476

原创 6.node中常用的path模块

path模块获取 路规范化路径/路径/文件名/扩展名path.normalize(filepath)path.dirname(filepath)path.basename(filepath)path.extname(filepath)路径组合path.join([…paths])path.resolve([…paths])获取相对路径path.relative(from参照, to)将对象转成字符串路径path.format(pathObject)将字符串

2021-08-24 16:47:11 212

原创 5.util工具模块

util工具模块该模块属于核心模块/内置模块,不需要安装可以直接使用util.inheritsutil.isArray 和 util.isFunctionutil.promisify 把方法转化成promise

2021-08-24 16:46:23 184

原创 4.node中的eventloop

https://segmentfault.com/a/1190000016278115

2021-08-24 16:45:38 143

原创 3.node中的nextTick、setTimeout和setImmediate

梯队setTimeout/setImmediate 第二梯队nextTick 最后一个梯队所以:无论nextTick与setImmediate谁在前谁在后,一定是nextTick先执行第二梯队setTimeout/setImmediate执行顺序谁先谁后都有可能setTimeout/setImmediate/nextTick执行顺序,主要看node的eventLoop,后面会写。nextTick、setImmediate和setTimeout回调函数中的this指向谁?ne

2021-08-23 20:44:33 407

原创 2.global 下的属性和方法

global 下的属性和方法globalconsoleprocessBuffer 缓存区(重点) 比如:文件读写都写在Buffer中clearImmediate 清除立即setImmediate 设置立即clearIntervalsetIntervalclearTimeoutsetInterval…1.globalglobal.global.global可以循环使用,没有太多实际意义2.consoleconsole.log 打印日志console.dir 不常用c

2021-08-23 20:43:20 203

原创 1.node中的this

nodejs中的thisnode与浏览器中this的区别浏览器中this指向顶层是windownode中this指向顶层是globalnode中的this文件中的内容,其实都是内一个函数包裹的(记住这一条,一切都解开了):function(exports, require, module, __filename, __dirname){ //你文件的代码}文件中的this,默认为{}。默认情况下node在执行的时候,是在文件中执行的,内部会给哲哥文件加一个自执行函数,

2021-08-23 20:42:31 506

原创 30.webpack——webpack5新特性(启动、持久化缓存、资源模块、URIs、moduleIds和chunkIds、tree shaking、nodeJs的polyfill被移除、模块联邦)

title: 3.webpack5的新特性date: 2021-08-17 20:345.URIsWebpack 5 支持在请求中处理协议支持data 支持 Base64 或原始编码,MimeType可以在module.rule中被映射到加载器和模块类型这是一个实验性的 api5.1 使用举例import data from “data:text/javascript, export default 'title'”;console.log(data6.moduleIds 和 ch.

2021-08-17 23:55:40 1530

转载 0.webpack——易混淆知识点(面试点)

【重学webpack系列——webpack5.0】1-15节主要讲webpack的使用,当然,建议结合《webpack学完这些就够了》一起学习。从本节开始,专攻webpack原理,只有深入原理,才能学到webpack设计的精髓,从而将技术点运用到实际项目中。可以点击上方专栏订阅哦。以下是本节正文:webpack中有很多容易混淆的概念,也是面试中经常会涉及的点,在这里给大家抛一个链接,个人认为写的比较好,可以参考学习:https://www.cnblogs.com/skychx/tag/

2021-08-17 21:08:18 228

原创 29.webpack——library与libraryTarget的用法/如何打包一个库文件

【重学webpack系列——webpack5.0】1-15节主要讲webpack的使用,当然,建议结合《webpack学完这些就够了》一起学习。从第16节开始,专攻webpack原理和高级API,只有深入原理和高级API,才能学到webpack设计的精髓,从而将技术点运用到实际项目中。可以点击上方专栏订阅哦。以下是本节正文:commonjs与commonjs2的区别// commonjsexports.add = function(a, b){ return a + b;}

2021-08-17 11:56:12 999

原创 28.webpack——module、chunk和bundle的区别

【重学webpack系列——webpack5.0】1-15节主要讲webpack的使用,当然,建议结合《webpack学完这些就够了》一起学习。从本节开始,专攻webpack原理,只有深入原理,才能学到webpack设计的精髓,从而将技术点运用到实际项目中。可以点击上方专栏订阅哦。以下是本节正文:module: 只要是文件,都是一个modulemchunk:代码块,是webpack根据功能拆分出来的(chunk是无法在打包结果中看到的,打包结果中看到的是bundle),包含三种

2021-08-17 11:41:13 496

原创 27.webpack——一文掌握webpack性能优化(高频面试点)

mainFilds和mainFilesresolve: { // 配置 target === "web" 或者 target === "webworker" 时 mainFields 默认值是: mainFields: ['browser', 'module', 'main'], // target 的值为其他时,mainFields 默认值为: mainFields: ["module", "main"],}这里的mainFileds代表了一个包解析入口文件应该看的字段,按照上面

2021-08-13 18:22:48 492

原创 26.重学webpack——如何开发一个webpack插件/webpack中的plugin的应用

【重学webpack系列——webpack5.0】1-15节主要讲webpack的使用,当然,建议结合《webpack学完这些就够了》一起学习。从本节开始,专攻webpack原理,只有深入原理,才能学到webpack设计的精髓,从而将技术点运用到实际项目中。可以点击上方专栏订阅哦。以下是本节正文:由于webpack基本配置无法满足开发者需求,所以需要借助plugin对webpack构建流程进行修改,来达到改变或优化webpack编译结果的目的。1.你有没有开发过插件,你是怎么开发开

2021-08-12 19:28:34 649

原创 25.重学webpack——梳理tapable的九大钩子函数的使用及原理

【重学webpack系列——webpack5.0】1-15节主要讲webpack的使用,当然,建议结合《webpack学完这些就够了》一起学习。从本节开始,专攻webpack原理,只有深入原理,才能学到webpack设计的精髓,从而将技术点运用到实际项目中。可以点击上方专栏订阅哦。以下是本节正文:webpack实现插件的流程:创建 - webpack在其内部对象上创建各种钩子Hook注册 - 插件讲自己的方法注册到对应的钩子Hook上,交给webpack调用 - webpack编

2021-08-09 21:45:04 747

原创 24.重学webpack——loader的原理及常用loader的实现(高频面试题)

【重学webpack系列——webpack5.0】1-15节主要讲webpack的使用,当然,建议结合《webpack学完这些就够了》一起学习。从本节开始,专攻webpack原理,只有深入原理,才能学到webpack设计的精髓,从而将技术点运用到实际项目中。可以点击上方专栏订阅哦。以下是本节正文:loader的原理1.loader介绍loader其实就是一个到处为函数的js模块,函数的参数接收上一个代码产生的结果或者资源文件。loader可以组合使用。loader的结果是Stri

2021-08-05 20:00:43 1076

原创 23.重学webpack——原理之webpack工作原理/工作流(高频面试题)

【重学webpack系列——webpack5.0】1-15节主要讲webpack的使用,当然,建议结合《webpack学完这些就够了》一起学习。从本节开始,专攻webpack原理,只有深入原理,才能学到webpack设计的精髓,从而将技术点运用到实际项目中。可以点击上方专栏订阅哦。以下是本节正文:webpack工作流1. webpack工作流步骤(高频面试点)初始化参数:从配置文件和Shell语句中读取并合并参数,得出最终的配置对象用上一步得到的参数初始化Compiler对象加

2021-08-05 14:55:30 322

原创 22.重学webpack——原理之初始tapable

【重学webpack系列——webpack5.0】1-15节主要讲webpack的使用,当然,建议结合《webpack学完这些就够了》一起学习。从本节开始,专攻webpack原理,只有深入原理,才能学到webpack设计的精髓,从而将技术点运用到实际项目中。可以点击上方专栏订阅哦。以下是本节正文:tapable 是一个类似于 Node.js 中的 EventEmitter的库,但更专注于自定义事件的触发和处理webpack本质上是一种事件流的机制,它的工作流程就是将各个插件串联起来,

2021-08-04 19:35:51 190

原创 21.重学webpack——三种webpack调试模式

【重学webpack系列——webpack5.0】1-15节主要讲webpack的使用,当然,建议结合《webpack学完这些就够了》一起学习。从本节开始,专攻webpack原理,只有深入原理,才能学到webpack设计的精髓,从而将技术点运用到实际项目中。可以点击上方专栏订阅哦。以下是本节正文:1.浏览器调试在node环境执行以下命令,会生成一个服务地址node --inspect-brk ./node_modules/webpack-cli/bin/cli.js浏览器打

2021-08-04 18:09:06 784

原创 JSON.stringify的三个参数你都用过吗?

前段时间勾股有提到stringify是支持三个参数,刷新的了我的认知,后来查到文档才发现还真的是支持三个参数的。参考资料:stringifystringify方法顾名思义,就是把JSON序列换,其语法如下:JSON.stringify(value[, replacer [, space]])注意到它接收三个参数,后面2个参数是可选的。只传一个参数var data = {name:"niuzai",info:{age:18,sex:"male"}};JSON.stringify(data);

2021-08-04 16:37:05 224

原创 20.重学webpack——手写babel中的es6中的箭头函数转成es5中的普通函数的插件(了解)

【重学webpack系列——webpack5.0】1-15节主要讲webpack的使用,当然,建议结合《webpack学完这些就够了》一起学习。从本节开始,专攻webpack原理,只有深入原理,才能学到webpack设计的精髓,从而将技术点运用到实际项目中。可以点击上方专栏订阅哦。以下是本节正文:babel能够将es6的大部分语法转换成es5,例如箭头函数转成普通函数等。今天就利用babel的一些库,手写一版箭头函数转换成普通函数,感受下ast语法树的作用。依赖库介绍(重点)@

2021-08-04 14:42:53 1068

原创 19.重学webpack——原理之AST抽象语法树

【重学webpack系列——webpack5.0】1-15节主要讲webpack的使用,当然,建议结合《webpack学完这些就够了》一起学习。从本节开始,专攻webpack原理,只有深入原理,才能学到webpack设计的精髓,从而将技术点运用到实际项目中。可以点击上方专栏订阅哦。以下是本节正文:ast语法树(会有专门章节详细介绍AST,本节只是了解大概过程)在我们工作中经常会用到,比如以下场景:代码语法的检查、代码风格的检查、代码的格式化、代码的高亮、代码错误提示、代码自动补全

2021-08-03 16:24:30 759

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除