CommonJs模块化实现原理&ES Module模块化原理 我们在src/index.js中引入了a.js、b.js, webpack会把’src/a.js’、‘src/b.js’作为modules的key值,该模块内容作为modules的value值;如果是通过export default 方式导出的,那就在 exports 对象加一个 default 属性。进行node ./build.js后查看dist文件下。执行入口函数,为防止命名污染,封装成立即执行函数。
tapable最详细源码分析及手写实现 tapable整体介绍tapable 是一个类似于 Node.js 中的 EventEmitter的库,但更专注于自定义事件的触发和处理。const { SyncHook, SyncBailHook, SyncWaterfallHook, SyncLoopHook, AsyncParallelHook, AsyncParallelBailHook, AsyncSeriesHook, AsyncSeriesBailHook, AsyncSeriesWaterfallHook, Asyn
V8 Promise源码全面解读 阅读本文你将收获什么?了解 V8 Promise 源码全过程,世界上不再有能困住你的 Promise 题目,我就是这么肯定这篇文章的干货仅仅了解或者实现了 Promise/A+ 规范,这与 JavaScript 的 Promise 中间还有很大的差距如果你在面试时将 Promise 回答到本文的深度,一定是收获 SP 或者 SSP offer 的利器,因为面试官大概率也不知道这些知识。你知道 浏览器 & Node 中真正的 Promise 执行顺序是怎么样的吗,如果你只是看过 Promise
记录webpack的source map使用详细说明 common.jsexport const show = () => { debugger document.write('hello webpack 11')}没有使用source-map,看一下调试效果:evaldevtool: 'eval'调试效果:eval - 每个模块都使用 eval() 执行,并且都有 //@ sourceURL。此选项会非常快地构建。主要缺点是,由于会映射到转换后的代码,而不是映射到原始代码(没有从 loader 中获取 source
webpack中hash、chunkHash、contentHash的区别 webpack中hash、chunkHash、contentHash的区别hashHash:和整个项⽬的构建相关,只要项⽬⽂件有修改,整个项⽬构建的hash值就会更改。这样会导致缓存失效。项目中的文件只要有一个文件改变,那么整个项目文件的hash都会改变。chunkhashchunkhash:和webpack 打包的chunk 有关,不同的entry 会⽣成不同的chunkhash值只有在改变某个chunk的文件时,才会生成对应的hash。比如我改变了index依赖的base.less文件构
详细记录如何在跨域请求中携带cookie 1. 搭建环境1.生成工程文件npm init 2.安装 expressnpm i express --save 3.新增app1.js,开启服务器3001const express = require('express')const app = express()const port = 3001// 设置`cookie`app.get("/login", (req, res) => { res.cookie("JESSIONID", "10101001", {
在 Vue 中正确使用 防抖 和 节流 1. 观察者防抖1. 在 create() 钩子 里,创建 防抖回调,并将其赋值到实例上:this.debouncedWatch = debounce(…, 500)。2. 在 观察者 回调 watch.value() { … } 中 传入正确的参数 调用 this.debouncedWatch()。3. 最后,beforeUnmount() 钩子中 调用 this.debouncedWatch.cancel() ,在卸载组件之前,取消所有还在 pending 的 防抖函数执行。<temp
箭头函数特殊性与普通函数的区别 参考:https://juejin.cn/post/7050492355056664612箭头函数没有[[Construct]]函数对象是一个支持[[Call]] 、 [[Construct]]内部方法的对象。每个支持[[Construct]]的对象必须支持[[Call]],也就是说,每个构造函数必须是一个函数对象。因此,构造函数也可以成为构造函数函数或构造函数对象。所以,想要对某个对象使用new,就得确保该对象具有 [[Construct]]这个内部方法。而箭头函数没有 [[Construct]]
将数组按指定大小分组 使用Array.from()创建新的数组, 这符合将生成的区块数。使用Array.slice()将新数组的每个元素映射到size长度的区块。如果原始数组不能均匀拆分, 则最终的块将包含剩余的元素。let chunk = (arr, size) => Array.from({ length: Math.ceil(arr.length / size)}, (v, i) => arr.slice(i * size, i * size + size));let arr = [1, 2, 3
Object.create()与new的具体实现与区别 Object.create与new区别function A() { this.name = 'abc';}A.prototype.a = 'a';A.prototype.showName = function () { return this.name;}var a1 = new A();var a2 = Object.create(A.prototype);从这个例子可以看出,a2只继承了A原型的属性和方法,a1 是构造函数 A 的实例,继承了构造函数 A 的属性
VueRouter源码详细解读 路由模式1. hash使用 URL hash 值来作路由。支持所有浏览器,包括不支持 HTML5 History Api 的浏览器。Hash URL,当 # 后面的哈希值发生变化时,不会向服务器请求数据,可以通过 hashchange 事件来监听到 URL 的变化,从而进行跳转页面。2. history依赖 HTML5 History API 和服务器配置3. abstract支持所有 JavaScript 运行环境,如 Node.js 服务器端。如果发现没有浏览器的 API,路由会自动强制进
解决ElementUI导航栏中的vue-router在3.0版本以上重复点菜单报错问题 解决ElementUI导航栏中的vue-router在3.0版本以上重复点菜单报错问题const originalPush = VueRouter.prototype.pushVueRouter.prototype.push = function push(location) { return originalPush.call(this, location).catch(err => err)}
Promise.all捕获错误 Promise.all默认只要有一个错误就直接返回错误。promise.all中任何一个promise 出现错误的时候都会执行reject,导致其它正常返回的数据也无法使用Promise.all([ Promise.resolve(1), Promise.reject('err'), Promise.resolve(2)]).then(res => { console.log(res)}).catch(err => { console.log('error', err)})
vue3中ref、reactive、shallowRef、 shallowReactive、toRaw、unref、toRef、toRefs、customRef使用与区别 refreftoRef普通ref对象特殊ref对象不会和原始对象挂钩创建的ref对象,与原始对象挂钩重新渲染不会触发渲染-普通ref对象不会和原始对象挂钩重新渲染如下面的例子中, ref对象改变,视图已更新,原始数据json保持不变。<template> <div>b = {{b}}</div></template><script>import { ref } from '...
Vite与webpack优势 Vite: 快缓存:依赖库缓存http缓存:源码协商缓存、模块强缓存esbuild: go语言 速度比webpack快10-100倍按需编译源码webpack 原生js编写的,性能不如go语言。
MutationObserver详解 MutationObserver用来监视 DOM 变动。DOM 的任何变动,比如节点的增减、属性的变动、文本内容的变动都会触发MutationObserver事件。但是,它与事件有一个本质不同:事件是同步触发,也就是说,DOM 的变动立刻会触发相应的事件;Mutation Observer 则是异步触发,DOM 的变动并不会马上触发,而是要等到当前所有 DOM 操作都结束才触发。Mutation Observer 有以下特点:它等待所有脚本任务完成后,才会运行(即异步触发方式)。它把 DOM 变动
判断是否是数组的方法 var _isArray = void 0; if (Array.isArray) { _isArray = Array.isArray; } else { _isArray = function (x) { return Object.prototype.toString.call(x) === '[object Array]'; }; }