├── src ├── index.js ├── monitor │ ├── utils │ │ ├── formatTime.js │ │ ├── onload.js │ │ ├── getLastEvent.js │ │ ├── getSelector.js │ │ └── tracker.js │ ├── index.js │ ├── lib │ │ ├── pv.js │ │ ├── longTask.js │ │ ├── xhr.js │ │ ├── blankScreen.js │ │ ├── fetch.js │ │ ├── jsError.js │ │ └── timing.js │ └── history │ │ ├── 1.js.html │ │ └── 2.network.html └── index.html ├── server.js ├── .gitignore ├── package.json ├── webpack.config.js ├── public ├── lighthouse.html └── optimize.md ├── README.md └── yarn.lock /src/index.js: -------------------------------------------------------------------------------- 1 | import './monitor/index' -------------------------------------------------------------------------------- /src/monitor/utils/formatTime.js: -------------------------------------------------------------------------------- 1 | export default (time) => new Date(time).getTime(); -------------------------------------------------------------------------------- /src/monitor/utils/onload.js: -------------------------------------------------------------------------------- 1 | export default function (callback) { 2 | if (document.readyState === "complete") { 3 | callback(); 4 | } else { 5 | window.addEventListener("load", callback); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | 3 | const app = express(); 4 | 5 | app.use(express.static('public')); 6 | 7 | app.listen(3000, () => { 8 | console.log("server started at 3000"); 9 | }); 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | # local env files 6 | .env.local 7 | .env.*.local 8 | 9 | # Log files 10 | npm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 13 | pnpm-debug.log* 14 | 15 | # Editor directories and files 16 | .idea 17 | .vscode 18 | *.suo 19 | *.ntvs* 20 | *.njsproj 21 | *.sln 22 | *.sw? -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "monitor", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "license": "MIT", 6 | "scripts": { 7 | "dev": "webpack-dev-server", 8 | "build": "webpack" 9 | }, 10 | "devDependencies": { 11 | "html-webpack-plugin": "^5.5.0", 12 | "user-agent": "^1.0.4", 13 | "webpack": "^5.62.1", 14 | "webpack-cli": "^4.9.1", 15 | "webpack-dev-server": "^4.4.0" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/monitor/index.js: -------------------------------------------------------------------------------- 1 | import { injectJsError } from "./lib/jsError"; 2 | import { injectXHR } from "./lib/xhr"; 3 | import { injectFetch } from "./lib/fetch"; 4 | import { blankScreen } from "./lib/blankScreen"; 5 | import { timing } from "./lib/timing"; 6 | import { longTask } from "./lib/longTask"; 7 | import { pv } from "./lib/pv"; 8 | 9 | injectJsError(); 10 | injectXHR(); 11 | injectFetch(); 12 | blankScreen(); 13 | timing(); 14 | longTask(); 15 | pv(); 16 | -------------------------------------------------------------------------------- /src/monitor/utils/getLastEvent.js: -------------------------------------------------------------------------------- 1 | let lastEvent; 2 | 3 | ["click", "touchstart", "mousedown", "keydown", "mouseover"].forEach( 4 | (eventType) => { 5 | document.addEventListener( 6 | eventType, 7 | (event) => { 8 | lastEvent = event; 9 | }, 10 | { 11 | capture: true, // 是在捕获阶段还是冒泡阶段执行 12 | passive: true, // 默认不阻止默认事件 13 | } 14 | ); 15 | } 16 | ); 17 | 18 | export default function () { 19 | return lastEvent; 20 | } 21 | -------------------------------------------------------------------------------- /src/monitor/lib/pv.js: -------------------------------------------------------------------------------- 1 | import tracker from "../utils/tracker"; 2 | export function pv() { 3 | var connection = navigator.connection; 4 | tracker.send({ 5 | kind: "business", 6 | type: "pv", 7 | effectiveType: connection.effectiveType, //网络环境 8 | rtt: connection.rtt, //往返时间 9 | screen: `${window.screen.width}x${window.screen.height}`, //设备分辨率 10 | }); 11 | let startTime = Date.now(); 12 | window.addEventListener( 13 | "unload", 14 | () => { 15 | let stayTime = Date.now() - startTime; 16 | tracker.send({ 17 | kind: "business", 18 | type: "stayTime", 19 | stayTime, 20 | }); 21 | }, 22 | false 23 | ); 24 | } 25 | -------------------------------------------------------------------------------- /src/monitor/lib/longTask.js: -------------------------------------------------------------------------------- 1 | import tracker from "../utils/tracker"; 2 | import formatTime from "../utils/formatTime"; 3 | import getLastEvent from "../utils/getLastEvent"; 4 | import getSelector from "../utils/getSelector"; 5 | 6 | export function longTask() { 7 | new PerformanceObserver((list) => { 8 | list.getEntries().forEach((entry) => { 9 | if (entry.duration > 100) { 10 | let lastEvent = getLastEvent(); 11 | requestIdleCallback(() => { 12 | tracker.send({ 13 | kind: "experience", 14 | type: "longTask", 15 | eventType: lastEvent.type, 16 | startTime: formatTime(entry.startTime), // 开始时间 17 | duration: formatTime(entry.duration), // 持续时间 18 | selector: lastEvent 19 | ? getSelector(lastEvent.path || lastEvent.target) 20 | : "", 21 | }); 22 | }); 23 | } 24 | }); 25 | }).observe({ entryTypes: ["longtask"] }); 26 | } 27 | -------------------------------------------------------------------------------- /src/monitor/utils/getSelector.js: -------------------------------------------------------------------------------- 1 | function getSelectors(path) { 2 | // 反转 + 过滤 + 映射 + 拼接 3 | return path 4 | .reverse() 5 | .filter((element) => { 6 | return element !== document && element !== window; 7 | }) 8 | .map((element) => { 9 | console.log("element", element.nodeName); 10 | let selector = ""; 11 | if (element.id) { 12 | return `${element.nodeName.toLowerCase()}#${element.id}`; 13 | } else if (element.className && typeof element.className === "string") { 14 | return `${element.nodeName.toLowerCase()}.${element.className}`; 15 | } else { 16 | selector = element.nodeName.toLowerCase(); 17 | } 18 | return selector; 19 | }) 20 | .join(" "); 21 | } 22 | 23 | export default function (pathsOrTarget) { 24 | if (Array.isArray(pathsOrTarget)) { 25 | return getSelectors(pathsOrTarget); 26 | } else { 27 | let path = []; 28 | while (pathsOrTarget) { 29 | path.push(pathsOrTarget); 30 | pathsOrTarget = pathsOrTarget.parentNode; 31 | } 32 | return getSelectors(path); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require("path"); 2 | const HtmlWebpackPlugin = require("html-webpack-plugin"); 3 | // user agent 把浏览器的 ua 转成一个对象 4 | 5 | module.exports = { 6 | entry: "./src/index.js", 7 | // 上下文目录 8 | context: process.cwd(), 9 | mode: "development", 10 | output: { 11 | path: path.resolve(__dirname, "dist"), 12 | filename: "monitor.js", 13 | }, 14 | devServer: { 15 | // devServer静态文件根目录 16 | // contentBase: path.resolve(__dirname, "dist"), 17 | // setupMiddlewares 18 | onBeforeSetupMiddleware: (devServer) => { 19 | if (!devServer) { 20 | throw new Error("webpack-dev-server is not defined"); 21 | } 22 | 23 | devServer.app.get("/success", function (req, res) { 24 | res.json({ id: 1 }); 25 | }); 26 | 27 | devServer.app.post("/error", function (req, res) { 28 | res.sendStatus(500); 29 | }); 30 | }, 31 | }, 32 | plugins: [ 33 | new HtmlWebpackPlugin({ 34 | template: "./src/index.html", 35 | inject: "head", // head or body, 36 | scriptLoading: "blocking", 37 | }), 38 | ], 39 | }; 40 | -------------------------------------------------------------------------------- /src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | monitor 7 | 8 | 9 |
10 |
11 | FMP 12 |
13 |
14 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /src/monitor/history/1.js.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 前端监控 8 | 9 | 10 | 11 |
12 |
13 | 19 | 25 |
26 |
27 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /src/monitor/lib/xhr.js: -------------------------------------------------------------------------------- 1 | import tracker from "../utils/tracker"; 2 | 3 | export function injectXHR() { 4 | let XMLHttpRequest = window.XMLHttpRequest; 5 | let oldOpen = XMLHttpRequest.prototype.open; 6 | XMLHttpRequest.prototype.open = function (method, url, async) { 7 | // 把上报接口过滤掉 8 | if (!url.match(/logstores/) && !url.match(/sockjs/)) { 9 | this.logData = { method, url, async }; 10 | } 11 | return oldOpen.apply(this, arguments); 12 | }; 13 | let oldSend = XMLHttpRequest.prototype.send; 14 | XMLHttpRequest.prototype.send = function (body) { 15 | if (this.logData) { 16 | let startTime = Date.now(); 17 | let handler = (type) => (event) => { 18 | // 持续时间 19 | let duration = Date.now() - startTime; 20 | let status = this.status; 21 | let statusText = this.statusText; 22 | tracker.send({ 23 | kind: "stability", 24 | type: "xhr", 25 | eventType: type, 26 | pathname: this.logData.url, 27 | status: status + "-" + statusText, // 状态码 28 | duration, 29 | response: this.response ? JSON.stringify(this.response) : "", // 响应体 30 | params: body || "", // 入参 31 | }); 32 | }; 33 | this.addEventListener("load", handler("load"), false); 34 | this.addEventListener("error", handler, false); 35 | this.addEventListener("abort", handler, false); 36 | } 37 | return oldSend.apply(this, arguments); 38 | }; 39 | } 40 | -------------------------------------------------------------------------------- /src/monitor/utils/tracker.js: -------------------------------------------------------------------------------- 1 | // 主机 2 | let host = "cn-guangdong-log.aliyuncs.com"; 3 | // 项目名 4 | let project = "yymonitor"; 5 | // 存储名 6 | let logstore = "yymonitor-store"; 7 | let userAgent = require("user-agent"); 8 | 9 | function getExtraData() { 10 | return { 11 | title: document.title, 12 | url: location.href, 13 | timestamp: Date.now(), 14 | userAgent: userAgent.parse(navigator.userAgent).name, 15 | }; 16 | } 17 | 18 | class SendTracker { 19 | constructor() { 20 | // 上报的路径 21 | this.url = `http://${project}.${host}/logstores/${logstore}/track`; 22 | this.xhr = new XMLHttpRequest(); 23 | } 24 | send(data = {}) { 25 | let extraData = getExtraData(); 26 | let log = { ...data, ...extraData }; 27 | // 阿里云要求值不能为数字 28 | for (const key in log) { 29 | if (typeof log[key] === "number") { 30 | log[key] = `${log[key]}`; 31 | } 32 | } 33 | console.log("log", log); 34 | // 接入日志系统,此处以阿里云为例 35 | let body = JSON.stringify({ 36 | __logs__: [log], 37 | }); 38 | this.xhr.open("POST", this.url, true); 39 | this.xhr.setRequestHeader("Content-Type", "application/json"); 40 | this.xhr.setRequestHeader("x-log-apiversion", "1.0.0"); 41 | this.xhr.setRequestHeader("x-log-bodyrawsize", body.length); 42 | this.xhr.onload = function () { 43 | // console.log(this.xhr.response); 44 | }; 45 | this.xhr.onerror = function (error) { 46 | console.log(error); 47 | }; 48 | this.xhr.send(body); 49 | } 50 | } 51 | 52 | export default new SendTracker(); 53 | -------------------------------------------------------------------------------- /src/monitor/history/2.network.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 前端监控 8 | 9 | 10 | 11 |
12 |
13 | 19 | 25 |
26 |
27 | 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /src/monitor/lib/blankScreen.js: -------------------------------------------------------------------------------- 1 | import tracker from "../utils/tracker"; 2 | import onload from "../utils/onload"; 3 | 4 | export function blankScreen() { 5 | // 控制密集度,如只有10密度,则无法检测到 6 | let NUM = 20; 7 | // 白屏过滤名单 8 | let wrapperElements = ["html", "body", "#container"]; 9 | let emptyPoints = 0; 10 | function getSelector(element) { 11 | const { id, className, nodeName } = element; 12 | if (id) { 13 | return "#" + id; 14 | } else if (className) { 15 | // 过滤空白符 + 拼接 16 | return ( 17 | "." + 18 | className 19 | .split(" ") 20 | .filter((item) => !!item) 21 | .join(".") 22 | ); 23 | } else { 24 | return nodeName.toLowerCase(); 25 | } 26 | } 27 | function isWrapper(element) { 28 | if (!element) { 29 | emptyPoints++; 30 | return; 31 | } 32 | let selector = getSelector(element); 33 | 34 | if (wrapperElements.indexOf(selector) !== -1) { 35 | emptyPoints++; 36 | } 37 | } 38 | // 刚开始页面内容为空,等页面渲染完成,再去做判断 39 | onload(function () { 40 | let xElements, yElements, xyDownElements, xyUpElements; 41 | const portion = NUM + 1 42 | const xPortion = window.innerWidth / portion; 43 | const yPortion = window.innerHeight / portion; 44 | for (let i = 0; i < NUM; i++) { 45 | xElements = document.elementFromPoint( 46 | xPortion * i, 47 | window.innerHeight / 2 48 | ); 49 | yElements = document.elementFromPoint( 50 | window.innerWidth / 2, 51 | yPortion * i 52 | ); 53 | xyDownElements = document.elementFromPoint( 54 | xPortion * i, 55 | yPortion * i 56 | ); 57 | xyUpElements = document.elementFromPoint( 58 | xPortion * i, 59 | yPortion * (NUM - i) 60 | ); 61 | 62 | isWrapper(xElements); 63 | isWrapper(yElements); 64 | isWrapper(xyDownElements); 65 | isWrapper(xyUpElements); 66 | } 67 | 68 | // 白屏 69 | if (emptyPoints == 4 * NUM) { 70 | const centerElements = document.elementsFromPoint( 71 | window.innerWidth / 2, 72 | window.innerHeight / 2 73 | ); 74 | console.log("emptyPoints++++++++++++++", getSelector(centerElements[0])); 75 | tracker.send({ 76 | kind: "stability", 77 | type: "blank", 78 | emptyPoints: emptyPoints + "", 79 | screen: window.screen.width + "X" + window.screen.height, 80 | viewPoint: window.innerWidth + "X" + window.innerHeight, 81 | selector: getSelector(centerElements[0]), 82 | }); 83 | } 84 | }); 85 | } 86 | -------------------------------------------------------------------------------- /src/monitor/lib/fetch.js: -------------------------------------------------------------------------------- 1 | import tracker from "../utils/tracker"; 2 | 3 | export function injectFetch () { 4 | let oldFetch = window.fetch; 5 | 6 | function hijackFetch (url, options) { 7 | let startTime = Date.now(); 8 | return new Promise((resolve, reject) => { 9 | oldFetch.apply(this, [url, options]).then(async response => { 10 | // response 为流数据 11 | const oldResponseJson = response.__proto__.json; 12 | response.__proto__.json = function(...responseRest) { 13 | return new Promise((responseResolve, responseReject) => { 14 | oldResponseJson.apply(this, responseRest).then(result => { 15 | responseResolve(result); 16 | }, (responseRejection) => { 17 | // 接口 18 | sendLogData({ 19 | url, 20 | startTime, 21 | statusText: response.statusText, 22 | status: response.status, 23 | eventType: 'error', 24 | response: responseRejection.stack, 25 | options 26 | }) 27 | responseReject(responseRejection) 28 | }) 29 | }) 30 | } 31 | resolve(response) 32 | }, rejection => { 33 | // 连接未连接上 34 | sendLogData({ 35 | url, 36 | startTime, 37 | eventType: 'load', 38 | response: rejection.stack, 39 | options 40 | }) 41 | reject(rejection) 42 | }) 43 | }) 44 | } 45 | window.fetch = hijackFetch; 46 | } 47 | 48 | const sendLogData = ({ 49 | startTime, 50 | statusText = '', 51 | status = '', 52 | eventType, 53 | url, 54 | options, 55 | response, 56 | }) => { 57 | // 持续时间 58 | let duration = Date.now() - startTime; 59 | const { method = 'get', body } = options || {} 60 | tracker.send({ 61 | kind: "stability", 62 | type: "fetch", 63 | eventType: eventType, 64 | pathname: url, 65 | status: status + "-" + statusText, // 状态码 66 | duration, 67 | response: response ? JSON.stringify(response) : "", // 响应体 68 | method, 69 | params: body || "", // 入参 70 | }); 71 | } -------------------------------------------------------------------------------- /src/monitor/lib/jsError.js: -------------------------------------------------------------------------------- 1 | import getLastEvent from "../utils/getLastEvent"; 2 | import getSelector from "../utils/getSelector"; 3 | import tracker from "../utils/tracker"; 4 | 5 | export function injectJsError() { 6 | // 监听全局未捕获的错误 7 | window.addEventListener( 8 | "error", 9 | (event) => { 10 | console.log("error+++++++++++", event); 11 | let lastEvent = getLastEvent(); // 获取到最后一个交互事件 12 | // 脚本加载错误 13 | if (event.target && (event.target.src || event.target.href)) { 14 | tracker.send({ 15 | kind: "stability", // 监控指标的大类,稳定性 16 | type: "error", // 小类型,这是一个错误 17 | errorType: "resourceError", // js执行错误 18 | filename: event.target.src || event.target.href, // 哪个文件报错了 19 | tagName: event.target.tagName, 20 | selector: getSelector(event.target), // 代表最后一个操作的元素 21 | }); 22 | } else { 23 | tracker.send({ 24 | kind: "stability", // 监控指标的大类,稳定性 25 | type: "error", // 小类型,这是一个错误 26 | errorType: "jsError", // js执行错误 27 | message: event.message, // 报错信息 28 | filename: event.filename, // 哪个文件报错了 29 | position: `${event.lineno}:${event.colno}`, // 报错的行列位置 30 | stack: getLines(event.error.stack), 31 | selector: lastEvent ? getSelector(lastEvent.path) : "", // 代表最后一个操作的元素 32 | }); 33 | } 34 | }, 35 | true 36 | ); 37 | 38 | window.addEventListener( 39 | "unhandledrejection", 40 | (event) => { 41 | console.log("unhandledrejection-------- ", event); 42 | let lastEvent = getLastEvent(); // 获取到最后一个交互事件 43 | let message; 44 | let filename; 45 | let line = 0; 46 | let column = 0; 47 | let stack = ""; 48 | let reason = event.reason; 49 | if (typeof reason === "string") { 50 | message = reason; 51 | } else if (typeof reason === "object") { 52 | message = reason.message; 53 | if (reason.stack) { 54 | let matchResult = reason.stack.match(/at\s+(.+):(\d+):(\d+)/); 55 | filename = matchResult[1]; 56 | line = matchResult[2]; 57 | column = matchResult[3]; 58 | } 59 | stack = getLines(reason.stack); 60 | } 61 | tracker.send({ 62 | kind: "stability", // 监控指标的大类,稳定性 63 | type: "error", // 小类型,这是一个错误 64 | errorType: "promiseError", // js执行错误 65 | message, // 报错信息 66 | filename, // 哪个文件报错了 67 | position: `${line}:${column}`, // 报错的行列位置 68 | stack, 69 | selector: lastEvent ? getSelector(lastEvent.path) : "", // 代表最后一个操作的元素 70 | }); 71 | }, 72 | true 73 | ); 74 | } 75 | 76 | function getLines(stack) { 77 | return stack 78 | .split("\n") 79 | .slice(1) 80 | .map((item) => item.replace(/^\s+at\s+/g, "")) 81 | .join("^"); 82 | } 83 | -------------------------------------------------------------------------------- /public/lighthouse.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | lighthouse 8 | 23 | 24 | 25 | 26 |
27 | 28 | 88 | 89 | 90 | -------------------------------------------------------------------------------- /src/monitor/lib/timing.js: -------------------------------------------------------------------------------- 1 | import tracker from "../utils/tracker"; 2 | import onload from "../utils/onload"; 3 | import formatTime from "../utils/formatTime"; 4 | import getLastEvent from "../utils/getLastEvent"; 5 | import getSelector from "../utils/getSelector"; 6 | 7 | export function timing() { 8 | let FMP, LCP; 9 | // 增加一个性能条目的观察者 10 | new PerformanceObserver((entryList, observer) => { 11 | const perfEntries = entryList.getEntries(); 12 | FMP = perfEntries[0]; 13 | observer.disconnect(); // 不再观察了 14 | }).observe({ entryTypes: ["element"] }); // 观察页面中有意义的元素 15 | // 增加一个性能条目的观察者 16 | new PerformanceObserver((entryList, observer) => { 17 | const perfEntries = entryList.getEntries(); 18 | const lastEntry = perfEntries[perfEntries.length - 1]; 19 | LCP = lastEntry; 20 | observer.disconnect(); // 不再观察了 21 | }).observe({ entryTypes: ["largest-contentful-paint"] }); // 观察页面中最大的元素 22 | // 增加一个性能条目的观察者 23 | new PerformanceObserver((entryList, observer) => { 24 | const lastEvent = getLastEvent(); 25 | const firstInput = entryList.getEntries()[0]; 26 | if (firstInput) { 27 | // 开始处理的时间 - 开始点击的时间,差值就是处理的延迟 28 | let inputDelay = firstInput.processingStart - firstInput.startTime; 29 | let duration = firstInput.duration; // 处理的耗时 30 | if (inputDelay > 0 || duration > 0) { 31 | tracker.send({ 32 | kind: "experience", // 用户体验指标 33 | type: "firstInputDelay", // 首次输入延迟 34 | inputDelay: inputDelay ? formatTime(inputDelay) : 0, // 延迟的时间 35 | duration: duration ? formatTime(duration) : 0, 36 | startTime: firstInput.startTime, // 开始处理的时间 37 | selector: lastEvent 38 | ? getSelector(lastEvent.path || lastEvent.target) 39 | : "", 40 | }); 41 | } 42 | } 43 | observer.disconnect(); // 不再观察了 44 | }).observe({ type: "first-input", buffered: true }); // 第一次交互 45 | 46 | // 刚开始页面内容为空,等页面渲染完成,再去做判断 47 | onload(function () { 48 | setTimeout(() => { 49 | const { 50 | fetchStart, 51 | connectStart, 52 | connectEnd, 53 | requestStart, 54 | responseStart, 55 | responseEnd, 56 | domLoading, 57 | domInteractive, 58 | domContentLoadedEventStart, 59 | domContentLoadedEventEnd, 60 | loadEventStart, 61 | } = window.performance.timing; 62 | // 发送时间指标 63 | tracker.send({ 64 | kind: "experience", // 用户体验指标 65 | type: "timing", // 统计每个阶段的时间 66 | connectTime: connectEnd - connectStart, // TCP连接耗时 67 | ttfbTime: responseStart - requestStart, // 首字节到达时间 68 | responseTime: responseEnd - responseStart, // response响应耗时 69 | parseDOMTime: loadEventStart - domLoading, // DOM解析渲染的时间 70 | domContentLoadedTime: 71 | domContentLoadedEventEnd - domContentLoadedEventStart, // DOMContentLoaded事件回调耗时 72 | timeToInteractive: domInteractive - fetchStart, // 首次可交互时间 73 | loadTime: loadEventStart - fetchStart, // 完整的加载时间 74 | }); 75 | // 发送性能指标 76 | let FP = performance.getEntriesByName("first-paint")[0]; 77 | let FCP = performance.getEntriesByName("first-contentful-paint")[0]; 78 | console.log("FP", FP); 79 | console.log("FCP", FCP); 80 | console.log("FMP", FMP); 81 | console.log("LCP", LCP); 82 | tracker.send({ 83 | kind: "experience", 84 | type: "paint", 85 | firstPaint: FP ? formatTime(FP.startTime) : 0, 86 | firstContentPaint: FCP ? formatTime(FCP.startTime) : 0, 87 | firstMeaningfulPaint: FMP ? formatTime(FMP.startTime) : 0, 88 | largestContentfulPaint: LCP 89 | ? formatTime(LCP.renderTime || LCP.loadTime) 90 | : 0, 91 | }); 92 | }, 3000); 93 | }); 94 | } 95 | -------------------------------------------------------------------------------- /public/optimize.md: -------------------------------------------------------------------------------- 1 | ### 3.1 减少未使用的 JavaScript 2 | 3 | - 请减少未使用的 JavaScript,并等到需要使用时再加载脚本,以减少网络活动耗用的字节数 4 | 5 | ### 3.2 采用新一代格式提供图片 6 | 7 | - WebP 和 AVIF 等图片格式的压缩效果通常优于 PNG 或 JPEG,因而下载速度更快,消耗的数据流量更少 8 | 9 | ### 3.3 适当调整图片大小 10 | 11 | - 提供大小合适的图片可节省移动数据网络流量并缩短加载用时 12 | 13 | ### 3.4 推迟加载屏幕外图片 14 | 15 | - 建议您在所有关键资源加载完毕后推迟加载屏幕外图片和处于隐藏状态的图片,从而缩短可交互前的耗时 16 | 17 | ### 3.5 移除阻塞渲染的资源 18 | 19 | - 资源阻止了系统对您网页的首次渲染。建议以内嵌方式提供关键的 JS/CSS,并推迟提供所有非关键的 JS/样式 20 | 21 | ### 3.6 减少未使用的 CSS 22 | 23 | - 请从样式表中减少未使用的规则,并延迟加载首屏内容未用到的 CSS,以减少网络活动耗用的字节数 24 | 25 | ### 3.7 使用视频格式提供动画内容 26 | 27 | - 使用大型 GIF 提供动画内容会导致效率低下。建议您改用 MPEG4/WebM 视频(来提供动画)和 PNG/WebP(来提供静态图片)以减少网络活动消耗的字节数 28 | 29 | ### 3.8 预先连接到必要的来源 30 | 31 | - 建议添加 `preconnect` 或 `dns-prefetch` 资源提示,以尽早与重要的第三方来源建立连接 32 | 33 | ### 3.9 应避免向新型浏览器提供旧版JavaScript 34 | 35 | - Polyfill 和 transform 让旧版浏览器能够使用新的 JavaScript 功能。不过,其中的很多函数对新型浏览器而言并非必需。对于打包的 JavaScript,请采用现代脚本部署策略,以便利用 module/nomodule 功能检测机制来减少传送到新型浏览器的代码量,同时保留对旧版浏览器的支持 36 | 37 | ### 3.10 确保文本在网页字体加载期间保持可见状态 38 | 39 | - 利用 font-display 这项 CSS 功能,确保文本在网页字体加载期间始终对用户可见 40 | 41 | ### 3.11 未使用被动式监听器来提高滚动性能 42 | 43 | - 建议您将触摸和滚轮事件监听器标记为 `passive`,以提高页面的滚动性能,`passive`不会对事件的默认行为说 no 44 | 45 | ### 3.12 图片元素没有明确的width和height 46 | 47 | - 请为图片元素设置明确的宽度值和高度值,以减少布局偏移并改善 CLS 48 | 49 | ### 3.13 注册“unload”事件监听器 50 | 51 | - `unload`事件不会可靠地触发,而且监听该事件可能会妨碍系统实施“往返缓存”之类的浏览器优化策略。建议您改用`pagehide`或`visibilitychange`事件 52 | 53 | ### 3.14 最大限度地减少主线程工作 54 | 55 | - 建议您减少为解析、编译和执行 JS 而花费的时间。您可能会发现,提供较小的 JS 负载有助于实现此目标 56 | 57 | ### 3.15 采用高效的缓存策略提供静态资源 58 | 59 | - 延长缓存期限可加快重访您网页的速度 60 | 61 | ### 3.16 缩短 JavaScript 执行用时 62 | 63 | - 建议您减少为解析、编译和执行 JS 而花费的时间。您可能会发现,提供较小的 JS 负载有助于实现此目标 64 | 65 | ### 3.17 避免链接关键请求 66 | 67 | - 下面的关键请求链显示了以高优先级加载的资源。请考虑缩短链长、缩减资源的下载文件大小,或者推迟下载不必要的资源,从而提高网页加载速度 68 | 69 | ### 3.18 请保持较低的请求数量和较小的传输大小 70 | 71 | - 若要设置页面资源数量和大小的预算,请添加 budget.json 文件 72 | 73 | ### 3.19 最大内容渲染时间元素 74 | 75 | - 这是此视口内渲染的最大内容元素 76 | 77 | ### 3.20 请避免出现大幅度的布局偏移 78 | 79 | - 这些 DOM 元素对该网页的 CLS 影响最大 80 | 81 | ### 3.21 应避免出现长时间运行的主线程任务 82 | 83 | - 列出了主线程中运行时间最长的任务,有助于识别出导致输入延迟的最主要原因 84 | 85 | ### 3.22 避免使用未合成的动画 86 | 87 | - 未合成的动画可能会卡顿并增加 CLS 88 | 89 | ### 3.23 缩减 CSS 90 | 91 | - 缩减 CSS 文件大小可缩减网络负载规模 92 | 93 | ### 3.24 缩减 JavaScript 94 | 95 | - 如果缩减 JavaScript 文件大小,则既能缩减负载规模,又能缩短脚本解析用时 96 | 97 | ### 3.25 对图片进行高效编码 98 | 99 | - 如果图片经过了优化,则加载速度会更快,且消耗的移动数据网络流量会更少 100 | 101 | ### 3.26 启用文本压缩 102 | 103 | - 对于文本资源,应先压缩(gzip、deflate 或 brotli),然后再提供,以最大限度地减少网络活动消耗的字节总数 104 | 105 | ### 3.27 初始服务器响应用时较短 106 | 107 | - 请确保服务器响应主文档的用时较短,因为这会影响到所有其他请求的响应时间 108 | 109 | ### 3.28 避免多次网页重定向 110 | 111 | - 重定向会在网页可加载前引入更多延迟 112 | 113 | ### 3.29 预加载关键请求 114 | 115 | - 建议使用 `` 来优先提取当前在网页加载后期请求的资源 116 | 117 | ### 3.30 使用 HTTP/2 118 | 119 | - HTTP/2 提供了许多优于 HTTP/1.1 的益处,包括二进制标头和多路复用 120 | 121 | ### 3.31 请移除 JavaScript 软件包中的重复模块 122 | 123 | - 从软件包中移除重复的大型 JavaScript 模块可减少网络传输时不必要的流量消耗 124 | 125 | ### 3.32 预加载 LCP 元素所用图片 126 | 127 | - 请预加载 Largest Contentful Paint (LCP) 元素所用的图片,以缩短您的 LCP 用时 128 | 129 | ### 3.33 避免网络负载过大 130 | 131 | - 网络负载过大不仅会让用户付出真金白银,还极有可能会延长加载用时 132 | 133 | ### 3.34 避免 DOM 规模过大 134 | 135 | - 大型 DOM 会增加内存使用量、导致样式计算用时延长,并产生高昂的布局重排成本 136 | 137 | ### 3.35 User Timing 标记和测量结果 138 | 139 | - 建议使用 User Timing API 检测您的应用,从而衡量应用在关键用户体验中的实际性能 140 | 141 | ### 3.36 尽量减少第三方使用 142 | 143 | - 第三方代码可能会显著影响加载性能。请限制冗余第三方提供商的数量,并尝试在页面完成主要加载后再加载第三方代码 144 | 145 | ### 3.37 使用 Facade 延迟加载第三方资源 146 | 147 | - 您可以延迟加载某些第三方嵌入代码。不妨考虑使用 Facade 替换这些代码,直到您需要使用它们为止 148 | 149 | ### 3.38 Largest Contentful Paint 所对应的图片未被延迟加载 150 | 151 | - 被延迟加载的首屏图片会在页面生命周期内的较晚时间呈现,这可能会致使系统延迟渲染最大内容元素 152 | 153 | ### 3.39 请勿使用 document.write() 154 | 155 | - 对于连接速度较慢的用户,通过 `document.write()` 动态注入的外部脚本可将网页加载延迟数十秒 156 | 157 | ### 3.40 具有包含 width 或 initial-scale 的 标记 158 | 159 | - `` 不仅会针对移动设备屏幕尺寸优化您的应用,还会阻止系统在响应用户输入前出现 300 毫秒的延迟 160 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### 概览 2 | > * 为什么要做前端监控 3 | > * 前端监控目标 4 | > * 前端监控流程 5 | > * 编写采集脚本 6 | > * 日志系统监控 7 | > * 错误监控 8 | > * 接口异常 9 | > * 白屏监控 10 | > * 加载时间 11 | > * 性能指标 12 | > * 卡顿 13 | > * pv 14 | > * [扩展问题](#qa) 15 | > 1. 性能监控指标 16 | > 1. 前端怎么做性能监控 17 | > 1. 线上错误监控怎么做 18 | > 1. 导致内存泄漏的方法,怎么监控内存泄漏 19 | > 1. Node 怎么做性能监控 20 | 21 | ## 1. 为什么要做前端监控 22 | 23 | * 更快的发现问题和解决问题 24 | * 做产品的决策依据 25 | * 为业务扩展提供了更多可能性 26 | * 提升前端工程师的技术深度和广度,打造简历亮点 27 | 28 | ## 2. 前端监控目标 29 | 30 | ### 2.1 稳定性 stability 31 | 32 | * js错误:js执行错误、promise异常 33 | * 资源错误:js、css资源加载异常 34 | * 接口错误:ajax、fetch请求接口异常 35 | * 白屏:页面空白 36 | 37 | ### 2.2 用户体验 experience 38 | 39 | ### 2.3 业务 business 40 | 41 | * pv:页面浏览量和点击量 42 | * uv:访问某个站点的不同ip的人数 43 | * 用户在每一个页面的停留时间 44 | 45 | ## 3. 前端监控流程 46 | 47 | 1. 前端埋点 48 | 1. 数据上报 49 | 1. 加工汇总 50 | 1. 可视化展示 51 | 1. 监控报警 52 | 53 | ![image.png](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/bd91043540624db19d7bb390ee9752e4~tplv-k3u1fbpfcp-watermark.image?) 54 | 55 | ### 3.1 常见的埋点方案 56 | 57 | #### 3.1.1 代码埋点 58 | 59 | * 嵌入代码的形式 60 | * 优点:精确(任意时刻,数据量全面) 61 | * 缺点:代码工作量点 62 | 63 | #### 3.1.2 可视化埋点 64 | 65 | * 通过可视化交互的手段,代替代码埋点 66 | * 将业务代码和埋点代码分离,提供一个可视化交互的页面,输入为业务代码,通过这个系统,可以在业务代码中自定义的增加埋点事件等等,最后输出的代码耦合了业务代码和埋点代码 67 | * 用系统来代替手工插入埋点代码 68 | 69 | #### 3.1.3 无痕埋点 70 | 71 | * 前端的任意一个事件被绑定一个标识,所有的事件都被记录下来 72 | * 通过定期上传记录文件,配合文件解析,解析出来我们想要的数据,并生成可视化报告供专业人员分析 73 | * 无痕埋点的优点是采集全量数据,不会出现漏埋和误埋等现象 74 | * 缺点是给数据传输和服务器增加压力,也无法灵活定制数据结构 75 | 76 | ## 4. 编写采集脚本 77 | 78 | ### 4.1 接入日志系统 79 | 80 | * 各公司一般都有自己的日志系统,接收数据上报,例如:阿里云 81 | 82 | ### 4.2 监控错误 83 | 84 | #### 4.2.1 错误分类 85 | 86 | * js错误(js执行错误,promise异常) 87 | * 资源加载异常:监听error 88 | 89 | #### 4.2.2 数据结构分析 90 | 91 | ##### 1. jsError 92 | 93 | ```json 94 | { 95 | "title": "前端监控系统", // 页面标题 96 | "url": "http://localhost:8080/", // 页面URL 97 | "timestamp": "1590815288710", // 访问时间戳 98 | "userAgent": "Chrome", // 用户浏览器类型 99 | "kind": "stability", // 大类 100 | "type": "error", // 小类 101 | "errorType": "jsError", // 错误类型 102 | "message": "Uncaught TypeError: Cannot set property 'error' of undefined", // 类型详情 103 | "filename": "http://localhost:8080/", // 访问的文件名 104 | "position": "0:0", // 行列信息 105 | "stack": "btnClick (http://localhost:8080/:20:39)^HTMLInputElement.onclick (http://localhost:8080/:14:72)", // 堆栈信息 106 | "selector": "HTML BODY #container .content INPUT" // 选择器 107 | } 108 | ``` 109 | 110 | ##### 2. promiseError 111 | 112 | ```json 113 | { 114 | ... 115 | "errorType": "promiseError",//错误类型 116 | "message": "someVar is not defined",//类型详情 117 | "stack": "http://localhost:8080/:24:29^new Promise ()^btnPromiseClick (http://localhost:8080/:23:13)^HTMLInputElement.onclick (http://localhost:8080/:15:86)",//堆栈信息 118 | "selector": "HTML BODY #container .content INPUT"//选择器 119 | } 120 | ``` 121 | 122 | ##### 3. resourceError 123 | 124 | ```json 125 | ... 126 | "errorType": "resourceError",//错误类型 127 | "filename": "http://localhost:8080/error.js",//访问的文件名 128 | "tagName": "SCRIPT",//标签名 129 | "timeStamp": "76",//时间 130 | ``` 131 | 132 | #### 4.2.3 实现 133 | 134 | ##### 1. 资源加载错误 + js执行错误 135 | 136 | ```js 137 | //一般JS运行时错误使用window.onerror捕获处理 138 | window.addEventListener( 139 | "error", 140 | function (event) { 141 | let lastEvent = getLastEvent(); 142 | // 有 e.target.src(href) 的认定为资源加载错误 143 | if (event.target && (event.target.src || event.target.href)) { 144 | tracker.send({ 145 | //资源加载错误 146 | kind: "stability", //稳定性指标 147 | type: "error", //resource 148 | errorType: "resourceError", 149 | filename: event.target.src || event.target.href, //加载失败的资源 150 | tagName: event.target.tagName, //标签名 151 | timeStamp: formatTime(event.timeStamp), //时间 152 | selector: getSelector(event.path || event.target), //选择器 153 | }); 154 | } else { 155 | tracker.send({ 156 | kind: "stability", //稳定性指标 157 | type: "error", //error 158 | errorType: "jsError", //jsError 159 | message: event.message, //报错信息 160 | filename: event.filename, //报错链接 161 | position: (event.lineNo || 0) + ":" + (event.columnNo || 0), //行列号 162 | stack: getLines(event.error.stack), //错误堆栈 163 | selector: lastEvent 164 | ? getSelector(lastEvent.path || lastEvent.target) 165 | : "", //CSS选择器 166 | }); 167 | } 168 | }, 169 | true 170 | ); // true代表在捕获阶段调用,false代表在冒泡阶段捕获,使用true或false都可以 171 | ``` 172 | ##### 2. promise异常 173 | 174 | ```js 175 | //当Promise 被 reject 且没有 reject 处理器的时候,会触发 unhandledrejection 事件 176 | window.addEventListener( 177 | "unhandledrejection", 178 | function (event) { 179 | let lastEvent = getLastEvent(); 180 | let message = ""; 181 | let line = 0; 182 | let column = 0; 183 | let file = ""; 184 | let stack = ""; 185 | if (typeof event.reason === "string") { 186 | message = event.reason; 187 | } else if (typeof event.reason === "object") { 188 | message = event.reason.message; 189 | } 190 | let reason = event.reason; 191 | if (typeof reason === "object") { 192 | if (reason.stack) { 193 | var matchResult = reason.stack.match(/at\s+(.+):(\d+):(\d+)/); 194 | if (matchResult) { 195 | file = matchResult[1]; 196 | line = matchResult[2]; 197 | column = matchResult[3]; 198 | } 199 | stack = getLines(reason.stack); 200 | } 201 | } 202 | tracker.send({ 203 | //未捕获的promise错误 204 | kind: "stability", //稳定性指标 205 | type: "error", //jsError 206 | errorType: "promiseError", //unhandledrejection 207 | message: message, //标签名 208 | filename: file, 209 | position: line + ":" + column, //行列 210 | stack, 211 | selector: lastEvent 212 | ? getSelector(lastEvent.path || lastEvent.target) 213 | : "", 214 | }); 215 | }, 216 | true 217 | ); // true代表在捕获阶段调用,false代表在冒泡阶段捕获,使用true或false都可以 218 | ``` 219 | 220 | ### 4.3 接口异常采集脚本 221 | 222 | #### 4.3.1 数据设计 223 | 224 | ```json 225 | { 226 | "title": "前端监控系统", //标题 227 | "url": "http://localhost:8080/", //url 228 | "timestamp": "1590817024490", //timestamp 229 | "userAgent": "Chrome", //浏览器版本 230 | "kind": "stability", //大类 231 | "type": "xhr", //小类 232 | "eventType": "load", //事件类型 233 | "pathname": "/success", //路径 234 | "status": "200-OK", //状态码 235 | "duration": "7", //持续时间 236 | "response": "{\"id\":1}", //响应内容 237 | "params": "" //参数 238 | } 239 | ``` 240 | 241 | ```json 242 | { 243 | "title": "前端监控系统", 244 | "url": "http://localhost:8080/", 245 | "timestamp": "1590817025617", 246 | "userAgent": "Chrome", 247 | "kind": "stability", 248 | "type": "xhr", 249 | "eventType": "load", 250 | "pathname": "/error", 251 | "status": "500-Internal Server Error", 252 | "duration": "7", 253 | "response": "", 254 | "params": "name=zhufeng" 255 | } 256 | ``` 257 | 258 | #### 4.3.2 实现 259 | 260 | 使用webpack devServer模拟请求 261 | 262 | * 重写xhr的open、send方法 263 | * 监听load、error、abort事件 264 | 265 | ```js 266 | import tracker from "../util/tracker"; 267 | export function injectXHR() { 268 | let XMLHttpRequest = window.XMLHttpRequest; 269 | let oldOpen = XMLHttpRequest.prototype.open; 270 | XMLHttpRequest.prototype.open = function ( 271 | method, 272 | url, 273 | async, 274 | username, 275 | password 276 | ) { 277 | // 上报的接口不用处理 278 | if (!url.match(/logstores/) && !url.match(/sockjs/)) { 279 | this.logData = { 280 | method, 281 | url, 282 | async, 283 | username, 284 | password, 285 | }; 286 | } 287 | return oldOpen.apply(this, arguments); 288 | }; 289 | let oldSend = XMLHttpRequest.prototype.send; 290 | let start; 291 | XMLHttpRequest.prototype.send = function (body) { 292 | if (this.logData) { 293 | start = Date.now(); 294 | let handler = (type) => (event) => { 295 | let duration = Date.now() - start; 296 | let status = this.status; 297 | let statusText = this.statusText; 298 | tracker.send({ 299 | //未捕获的promise错误 300 | kind: "stability", //稳定性指标 301 | type: "xhr", //xhr 302 | eventType: type, //load error abort 303 | pathname: this.logData.url, //接口的url地址 304 | status: status + "-" + statusText, 305 | duration: "" + duration, //接口耗时 306 | response: this.response ? JSON.stringify(this.response) : "", 307 | params: body || "", 308 | }); 309 | }; 310 | this.addEventListener("load", handler("load"), false); 311 | this.addEventListener("error", handler("error"), false); 312 | this.addEventListener("abort", handler("abort"), false); 313 | } 314 | oldSend.apply(this, arguments); 315 | }; 316 | } 317 | ``` 318 | * 重写fetch方法 319 | ```js 320 | import tracker from "../utils/tracker"; 321 | 322 | export function injectFetch () { 323 | let oldFetch = window.fetch; 324 | 325 | function hijackFetch (url, options) { 326 | let startTime = Date.now(); 327 | return new Promise((resolve, reject) => { 328 | oldFetch.apply(this, [url, options]).then(async response => { 329 | // response 为流数据 330 | const oldResponseJson = response.__proto__.json; 331 | response.__proto__.json = function(...responseRest) { 332 | return new Promise((responseResolve, responseReject) => { 333 | oldResponseJson.apply(this, responseRest).then(result => { 334 | responseResolve(result); 335 | }, (responseRejection) => { 336 | // 接口 337 | sendLogData({ 338 | url, 339 | startTime, 340 | statusText: response.statusText, 341 | status: response.status, 342 | eventType: 'error', 343 | response: responseRejection.stack, 344 | options 345 | }) 346 | responseReject(responseRejection) 347 | }) 348 | }) 349 | } 350 | resolve(response) 351 | }, rejection => { 352 | // 连接未连接上 353 | sendLogData({ 354 | url, 355 | startTime, 356 | eventType: 'load', 357 | response: rejection.stack, 358 | options 359 | }) 360 | reject(rejection) 361 | }) 362 | }) 363 | } 364 | window.fetch = hijackFetch; 365 | } 366 | 367 | const sendLogData = ({ 368 | startTime, 369 | statusText = '', 370 | status = '', 371 | eventType, 372 | url, 373 | options, 374 | response, 375 | }) => { 376 | // 持续时间 377 | let duration = Date.now() - startTime; 378 | const { method = 'get', body } = options || {} 379 | tracker.send({ 380 | kind: "stability", 381 | type: "fetch", 382 | eventType: eventType, 383 | pathname: url, 384 | status: status + "-" + statusText, // 状态码 385 | duration, 386 | response: response ? JSON.stringify(response) : "", // 响应体 387 | method, 388 | params: body || "", // 入参 389 | }); 390 | } 391 | ``` 392 | ### 4.4 白屏 393 | 394 | - 白屏就是页面上什么都没有 395 | 396 | #### 4.4.1 数据设计 397 | 398 | ```js 399 | { 400 | "title": "前端监控系统", 401 | "url": "http://localhost:8080/", 402 | "timestamp": "1590822618759", 403 | "userAgent": "chrome", 404 | "kind": "stability", //大类 405 | "type": "blank", //小类 406 | "emptyPoints": "0", //空白点 407 | "screen": "2049x1152", //分辨率 408 | "viewPoint": "2048x994", //视口 409 | "selector": "HTML BODY #container" //选择器 410 | } 411 | ``` 412 | 413 | #### 4.4.2 实现 414 | 415 | - [elementsFromPoint](https://developer.mozilla.org/zh-CN/docs/Web/API/Document/elementsFromPoint)方法可以获取到当前视口内指定坐标处,由里到外排列的所有元素 416 | - 根据 elementsFromPoint api,获取屏幕水平中线和竖直中线所在的元素 417 | 418 | ```js 419 | import tracker from "../util/tracker"; 420 | import onload from "../util/onload"; 421 | function getSelector(element) { 422 | var selector; 423 | if (element.id) { 424 | selector = `#${element.id}`; 425 | } else if (element.className && typeof element.className === "string") { 426 | selector = 427 | "." + 428 | element.className 429 | .split(" ") 430 | .filter(function (item) { 431 | return !!item; 432 | }) 433 | .join("."); 434 | } else { 435 | selector = element.nodeName.toLowerCase(); 436 | } 437 | return selector; 438 | } 439 | export function blankScreen() { 440 | // 控制密集度,如只有10密度,则无法检测到 441 | let NUM = 20; 442 | // 白屏过滤名单 443 | let wrapperElements = ["html", "body", "#container"]; 444 | let emptyPoints = 0; 445 | function isWrapper(element) { 446 | if (!element) { 447 | emptyPoints++; 448 | return; 449 | } 450 | let selector = getSelector(element); 451 | 452 | if (wrapperElements.indexOf(selector) !== -1) { 453 | emptyPoints++; 454 | } 455 | } 456 | // 刚开始页面内容为空,等页面渲染完成,再去做判断 457 | onload(function () { 458 | let xElements, yElements, xyDownElements, xyUpElements; 459 | const portion = NUM + 1 460 | const xPortion = window.innerWidth / portion; 461 | const yPortion = window.innerHeight / portion; 462 | for (let i = 0; i < NUM; i++) { 463 | xElements = document.elementFromPoint( 464 | xPortion * i, 465 | window.innerHeight / 2 466 | ); 467 | yElements = document.elementFromPoint( 468 | window.innerWidth / 2, 469 | yPortion * i 470 | ); 471 | xyDownElements = document.elementFromPoint( 472 | xPortion * i, 473 | yPortion * i 474 | ); 475 | xyUpElements = document.elementFromPoint( 476 | xPortion * i, 477 | yPortion * (NUM - i) 478 | ); 479 | 480 | isWrapper(xElements); 481 | isWrapper(yElements); 482 | isWrapper(xyDownElements); 483 | isWrapper(xyUpElements); 484 | } 485 | // 白屏 486 | if (emptyPoints == 4 * NUM) { 487 | const centerElements = document.elementsFromPoint( 488 | window.innerWidth / 2, 489 | window.innerHeight / 2 490 | ); 491 | console.log("emptyPoints++++++++++++++", getSelector(centerElements[0])); 492 | tracker.send({ 493 | kind: "stability", 494 | type: "blank", 495 | emptyPoints: emptyPoints + "", 496 | screen: window.screen.width + "X" + window.screen.height, 497 | viewPoint: window.innerWidth + "X" + window.innerHeight, 498 | selector: getSelector(centerElements[0]), 499 | }); 500 | } 501 | }); 502 | } 503 | //screen.width 屏幕的宽度 screen.height 屏幕的高度 504 | //window.innerWidth 去除工具条与滚动条的窗口宽度 window.innerHeight 去除工具条与滚动条的窗口高度 505 | ``` 506 | 507 | ### 4.5 加载时间 508 | 509 | - [PerformanceTiming](https://developer.mozilla.org/zh-CN/docs/Web/API/PerformanceTiming) 510 | - [DOMContentLoaded](https://developer.mozilla.org/zh-CN/docs/Web/Events/DOMContentLoaded) 511 | - [FMP](https://docs.google.com/document/d/1BR94tJdZLsin5poeet0XoTW60M0SjvOJQttKT-JK8HI/view#) 512 | 513 | #### 4.5.1 阶段含义 514 | 515 | ![image.png](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/7d30801313694b8bbf1e8977b8d8bd45~tplv-k3u1fbpfcp-watermark.image?) 516 | 517 | 字段 | 含义 | 518 | | -------------------------- | -------------------------------------------------------------------------------------------------------------------------- | 519 | | navigationStart | 初始化页面,在同一个浏览器上下文中前一个页面unload的时间戳,如果没有前一个页面的unload,则与fetchStart值相等 | 520 | | redirectStart | 第一个HTTP重定向发生的时间,有跳转且是同域的重定向,否则为0 | 521 | | redirectEnd | 最后一个重定向完成时的时间,否则为0 | 522 | | fetchStart | 浏览器准备好使用http请求获取文档的时间,这发生在检查缓存之前 | 523 | | domainLookupStart | DNS域名开始查询的时间,如果有本地的缓存或keep-alive则时间为0 | 524 | | domainLookupEnd | DNS域名结束查询的时间 | 525 | | connectStart | TCP开始建立连接的时间,如果是持久连接,则与`fetchStart`值相等 | 526 | | secureConnectionStart | https 连接开始的时间,如果不是安全连接则为0 | 527 | | connectEnd | TCP完成握手的时间,如果是持久连接则与`fetchStart`值相等 | 528 | | requestStart | HTTP请求读取真实文档开始的时间,包括从本地缓存读取 | 529 | | requestEnd | HTTP请求读取真实文档结束的时间,包括从本地缓存读取 | 530 | | responseStart | 返回浏览器从服务器收到(或从本地缓存读取)第一个字节时的Unix毫秒时间戳 | 531 | | responseEnd | 返回浏览器从服务器收到(或从本地缓存读取,或从本地资源读取)最后一个字节时的Unix毫秒时间戳 | 532 | | unloadEventStart | 前一个页面的unload的时间戳 如果没有则为0 | 533 | | unloadEventEnd | 与`unloadEventStart`相对应,返回的是`unload`函数执行完成的时间戳 | 534 | | domLoading | 返回当前网页DOM结构开始解析时的时间戳,此时`document.readyState`变成loading,并将抛出`readyStateChange`事件 | 535 | | domInteractive | 返回当前网页DOM结构结束解析、开始加载内嵌资源时时间戳,`document.readyState` 变成`interactive`,并将抛出`readyStateChange`事件(注意只是DOM树解析完成,这时候并没有开始加载网页内的资源) | 536 | | domContentLoadedEventStart | 网页domContentLoaded事件发生的时间 | 537 | | domContentLoadedEventEnd | 网页domContentLoaded事件脚本执行完毕的时间,domReady的时间 | 538 | | domComplete | DOM树解析完成,且资源也准备就绪的时间,`document.readyState`变成`complete`.并将抛出`readystatechange`事件 | 539 | | loadEventStart | load 事件发送给文档,也即load回调函数开始执行的时间 | 540 | | loadEventEnd | load回调函数执行完成的时间 541 | 542 | #### 4.5.2 阶段计算 543 | 544 | 字段 | 描述 | 计算方式 | 意义 | 545 | | --------- | ------------------------------ | ----------------------------------------------------- | ---------------------------------------------------------------- | 546 | | unload | 前一个页面卸载耗时 | unloadEventEnd – unloadEventStart | - | 547 | | redirect | 重定向耗时 | redirectEnd – redirectStart | 重定向的时间 | 548 | | appCache | 缓存耗时 | domainLookupStart – fetchStart | 读取缓存的时间 | 549 | | dns | DNS 解析耗时 | domainLookupEnd – domainLookupStart | 可观察域名解析服务是否正常 | 550 | | tcp | TCP 连接耗时 | connectEnd – connectStart | 建立连接的耗时 | 551 | | ssl | SSL 安全连接耗时 | connectEnd – secureConnectionStart | 反映数据安全连接建立耗时 | 552 | | ttfb | Time to First Byte(TTFB)网络请求耗时 | responseStart – requestStart | TTFB是发出页面请求到接收到应答数据第一个字节所花费的毫秒数 | 553 | | response | 响应数据传输耗时 | responseEnd – responseStart | 观察网络是否正常 | 554 | | dom | DOM解析耗时 | domInteractive – responseEnd | 观察DOM结构是否合理,是否有JS阻塞页面解析 | 555 | | dcl | DOMContentLoaded 事件耗时 | domContentLoadedEventEnd – domContentLoadedEventStart | 当 HTML 文档被完全加载和解析完成之后,DOMContentLoaded 事件被触发,无需等待样式表、图像和子框架的完成加载 | 556 | | resources | 资源加载耗时 | domComplete – domContentLoadedEventEnd | 可观察文档流是否过大 | 557 | | domReady | DOM阶段渲染耗时 | domContentLoadedEventEnd – fetchStart | DOM树和页面资源加载完成时间,会触发`domContentLoaded`事件 | 558 | | 首次渲染耗时 | 首次渲染耗时 | responseEnd-fetchStart | 加载文档到看到第一帧非空图像的时间,也叫白屏时间 | 559 | | 首次可交互时间 | 首次可交互时间 | domInteractive-fetchStart | DOM树解析完成时间,此时document.readyState为interactive | 560 | | 首包时间耗时 | 首包时间 | responseStart-domainLookupStart | DNS解析到响应返回给浏览器第一个字节的时间 | 561 | | 页面完全加载时间 | 页面完全加载时间 | loadEventStart - fetchStart | - | 562 | | onLoad | onLoad事件耗时 | loadEventEnd – loadEventStart 563 | 564 | ![image.png](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/19ac271140f74522b13dabe05cb4a0c8~tplv-k3u1fbpfcp-watermark.image?) 565 | 566 | #### 4.5.3 数据结构 567 | 568 | ```json 569 | { 570 | "title": "前端监控系统", 571 | "url": "http://localhost:8080/", 572 | "timestamp": "1590828364183", 573 | "userAgent": "chrome", 574 | "kind": "experience", 575 | "type": "timing", 576 | "connectTime": "0", 577 | "ttfbTime": "1", 578 | "responseTime": "1", 579 | "parseDOMTime": "80", 580 | "domContentLoadedTime": "0", 581 | "timeToInteractive": "88", 582 | "loadTime": "89" 583 | } 584 | ``` 585 | 586 | #### 4.5.4 实现 587 | 588 | ```js 589 | import onload from "../util/onload"; 590 | import tracker from "../util/tracker"; 591 | import formatTime from "../util/formatTime"; 592 | import getLastEvent from "../util/getLastEvent"; 593 | import getSelector from "../util/getSelector"; 594 | export function timing() { 595 | onload(function () { 596 | setTimeout(() => { 597 | const { 598 | fetchStart, 599 | connectStart, 600 | connectEnd, 601 | requestStart, 602 | responseStart, 603 | responseEnd, 604 | domLoading, 605 | domInteractive, 606 | domContentLoadedEventStart, 607 | domContentLoadedEventEnd, 608 | loadEventStart, 609 | } = performance.timing; 610 | tracker.send({ 611 | kind: "experience", 612 | type: "timing", 613 | connectTime: connectEnd - connectStart, //TCP连接耗时 614 | ttfbTime: responseStart - requestStart, //ttfb 615 | responseTime: responseEnd - responseStart, //Response响应耗时 616 | parseDOMTime: loadEventStart - domLoading, //DOM解析渲染耗时 617 | domContentLoadedTime: 618 | domContentLoadedEventEnd - domContentLoadedEventStart, //DOMContentLoaded事件回调耗时 619 | timeToInteractive: domInteractive - fetchStart, //首次可交互时间 620 | loadTime: loadEventStart - fetchStart, //完整的加载时间 621 | }); 622 | }, 3000); 623 | }); 624 | } 625 | 626 | ``` 627 | 628 | ### 4.6 性能指标 629 | 630 | - [PerformanceObserver.observe](https://developer.mozilla.org/zh-CN/docs/Web/API/PerformanceObserver/observe)方法用于观察传入的参数中指定的性能条目类型的集合。当记录一个指定类型的性能条目时,性能监测对象的回调函数将会被调用 631 | - [entryType](https://developer.mozilla.org/zh-CN/docs/Web/API/PerformanceEntry/entryType) 632 | - [paint-timing](https://w3c.github.io/paint-timing/) 633 | - [event-timing](https://wicg.github.io/event-timing/) 634 | - [LCP](https://wicg.github.io/largest-contentful-paint/) 635 | - [FMP](https://docs.google.com/document/d/1BR94tJdZLsin5poeet0XoTW60M0SjvOJQttKT-JK8HI/view) 636 | - [time-to-interactive](https://github.com/WICG/time-to-interactive) 637 | 638 | | 字段 | 描述 | 备注 | 计算方式 | 639 | | --- | ---------------------------------- | ------------------------------------------------------------------ | ---- | 640 | | FP | First Paint(首次绘制) | 包括了任何用户自定义的背景绘制,它是首先将像素绘制到屏幕的时刻 | | 641 | | FCP | First Content Paint(首次内容绘制) | 是浏览器将第一个 DOM 渲染到屏幕的时间,可能是文本、图像、SVG等,这其实就是白屏时间 | | 642 | | FMP | First Meaningful Paint(首次有意义绘制) | 页面有意义的内容渲染的时间 | | 643 | | LCP | (Largest Contentful Paint)(最大内容渲染) | 代表在viewport中最大的页面元素加载的时间 | | 644 | | DCL | (DomContentLoaded)(DOM加载完成) | 当 HTML 文档被完全加载和解析完成之后, DOMContentLoaded 事件被触发,无需等待样式表、图像和子框架的完成加载 | | 645 | | L | (onLoad) | 当依赖的资源全部加载完毕之后才会触发 | | 646 | | TTI | (Time to Interactive) 可交互时间 | 用于标记应用已进行视觉渲染并能可靠响应用户输入的时间点 | | 647 | | FID | First Input Delay(首次输入延迟) | 用户首次和页面交互(单击链接,点击按钮等)到页面响应交互的时间 648 | 649 | 650 | ![image.png](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/3421a08b415145a08d438dc457b57860~tplv-k3u1fbpfcp-watermark.image?) 651 | 652 | 653 | ![image.png](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b9a4cc37d8eb44be883fc40f2d0093e1~tplv-k3u1fbpfcp-watermark.image?) 654 | 655 | #### 4.6.1 数据结构设计 656 | 657 | ##### 1. paint 658 | 659 | ```json 660 | { 661 | "title": "前端监控系统", 662 | "url": "http://localhost:8080/", 663 | "timestamp": "1590828364186", 664 | "userAgent": "chrome", 665 | "kind": "experience", 666 | "type": "paint", 667 | "firstPaint": "102", 668 | "firstContentPaint": "2130", 669 | "firstMeaningfulPaint": "2130", 670 | "largestContentfulPaint": "2130" 671 | } 672 | ``` 673 | 674 | ##### 2. firstInputDelay 675 | 676 | ```json 677 | { 678 | "title": "前端监控系统", 679 | "url": "http://localhost:8080/", 680 | "timestamp": "1590828477284", 681 | "userAgent": "chrome", 682 | "kind": "experience", 683 | "type": "firstInputDelay", 684 | "inputDelay": "3", 685 | "duration": "8", 686 | "startTime": "4812.344999983907", 687 | "selector": "HTML BODY #container .content H1" 688 | } 689 | ``` 690 | 691 | #### 4.6.2 实现 692 | 693 | 关键时间节点通过window.performance.timing获取 694 | 695 | ![image.png](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/9369074ff2554710abad169c8ba772ba~tplv-k3u1fbpfcp-watermark.image?) 696 | 697 | ```js 698 | import tracker from "../utils/tracker"; 699 | import onload from "../utils/onload"; 700 | import getLastEvent from "../utils/getLastEvent"; 701 | import getSelector from "../utils/getSelector"; 702 | 703 | export function timing() { 704 | let FMP, LCP; 705 | // 增加一个性能条目的观察者 706 | new PerformanceObserver((entryList, observer) => { 707 | const perfEntries = entryList.getEntries(); 708 | FMP = perfEntries[0]; 709 | observer.disconnect(); // 不再观察了 710 | }).observe({ entryTypes: ["element"] }); // 观察页面中有意义的元素 711 | // 增加一个性能条目的观察者 712 | new PerformanceObserver((entryList, observer) => { 713 | const perfEntries = entryList.getEntries(); 714 | const lastEntry = perfEntries[perfEntries.length - 1]; 715 | LCP = lastEntry; 716 | observer.disconnect(); // 不再观察了 717 | }).observe({ entryTypes: ["largest-contentful-paint"] }); // 观察页面中最大的元素 718 | // 增加一个性能条目的观察者 719 | new PerformanceObserver((entryList, observer) => { 720 | const lastEvent = getLastEvent(); 721 | const firstInput = entryList.getEntries()[0]; 722 | if (firstInput) { 723 | // 开始处理的时间 - 开始点击的时间,差值就是处理的延迟 724 | let inputDelay = firstInput.processingStart - firstInput.startTime; 725 | let duration = firstInput.duration; // 处理的耗时 726 | if (inputDelay > 0 || duration > 0) { 727 | tracker.send({ 728 | kind: "experience", // 用户体验指标 729 | type: "firstInputDelay", // 首次输入延迟 730 | inputDelay: inputDelay ? formatTime(inputDelay) : 0, // 延迟的时间 731 | duration: duration ? formatTime(duration) : 0, 732 | startTime: firstInput.startTime, // 开始处理的时间 733 | selector: lastEvent 734 | ? getSelector(lastEvent.path || lastEvent.target) 735 | : "", 736 | }); 737 | } 738 | } 739 | observer.disconnect(); // 不再观察了 740 | }).observe({ type: "first-input", buffered: true }); // 第一次交互 741 | 742 | // 刚开始页面内容为空,等页面渲染完成,再去做判断 743 | onload(function () { 744 | setTimeout(() => { 745 | const { 746 | fetchStart, 747 | connectStart, 748 | connectEnd, 749 | requestStart, 750 | responseStart, 751 | responseEnd, 752 | domLoading, 753 | domInteractive, 754 | domContentLoadedEventStart, 755 | domContentLoadedEventEnd, 756 | loadEventStart, 757 | } = window.performance.timing; 758 | // 发送时间指标 759 | tracker.send({ 760 | kind: "experience", // 用户体验指标 761 | type: "timing", // 统计每个阶段的时间 762 | connectTime: connectEnd - connectStart, // TCP连接耗时 763 | ttfbTime: responseStart - requestStart, // 首字节到达时间 764 | responseTime: responseEnd - responseStart, // response响应耗时 765 | parseDOMTime: loadEventStart - domLoading, // DOM解析渲染的时间 766 | domContentLoadedTime: 767 | domContentLoadedEventEnd - domContentLoadedEventStart, // DOMContentLoaded事件回调耗时 768 | timeToInteractive: domInteractive - fetchStart, // 首次可交互时间 769 | loadTime: loadEventStart - fetchStart, // 完整的加载时间 770 | }); 771 | // 发送性能指标 772 | let FP = performance.getEntriesByName("first-paint")[0]; 773 | let FCP = performance.getEntriesByName("first-contentful-paint")[0]; 774 | console.log("FP", FP); 775 | console.log("FCP", FCP); 776 | console.log("FMP", FMP); 777 | console.log("LCP", LCP); 778 | tracker.send({ 779 | kind: "experience", 780 | type: "paint", 781 | firstPaint: FP ? formatTime(FP.startTime) : 0, 782 | firstContentPaint: FCP ? formatTime(FCP.startTime) : 0, 783 | firstMeaningfulPaint: FMP ? formatTime(FMP.startTime) : 0, 784 | largestContentfulPaint: LCP 785 | ? formatTime(LCP.renderTime || LCP.loadTime) 786 | : 0, 787 | }); 788 | }, 3000); 789 | }); 790 | } 791 | ``` 792 | 793 | 794 | #### 795 | 796 | ### 4.7 卡顿 797 | 798 | - 响应用户交互的响应时间如果大于100ms,用户就会感觉卡顿 799 | 800 | #### 4.7.1 数据设计 longTask 801 | 802 | ```json 803 | { 804 | "title": "前端监控系统", 805 | "url": "http://localhost:8080/", 806 | "timestamp": "1590828656781", 807 | "userAgent": "chrome", 808 | "kind": "experience", 809 | "type": "longTask", 810 | "eventType": "mouseover", 811 | "startTime": "9331", 812 | "duration": "200", 813 | "selector": "HTML BODY #container .content" 814 | } 815 | ``` 816 | 817 | #### 4.7.2 实现 818 | 819 | * new PerformanceObserver 820 | * entry.duration > 100 判断大于100ms,即可认定为长任务 821 | * 使用 requestIdleCallback上报数据 822 | 823 | ```js 824 | import tracker from "../util/tracker"; 825 | import formatTime from "../util/formatTime"; 826 | import getLastEvent from "../util/getLastEvent"; 827 | import getSelector from "../util/getSelector"; 828 | export function longTask() { 829 | new PerformanceObserver((list) => { 830 | list.getEntries().forEach((entry) => { 831 | if (entry.duration > 100) { 832 | let lastEvent = getLastEvent(); 833 | requestIdleCallback(() => { 834 | tracker.send({ 835 | kind: "experience", 836 | type: "longTask", 837 | eventType: lastEvent.type, 838 | startTime: formatTime(entry.startTime), // 开始时间 839 | duration: formatTime(entry.duration), // 持续时间 840 | selector: lastEvent 841 | ? getSelector(lastEvent.path || lastEvent.target) 842 | : "", 843 | }); 844 | }); 845 | } 846 | }); 847 | }).observe({ entryTypes: ["longtask"] }); 848 | } 849 | ``` 850 | 851 | ### 4.8 PV、UV、用户停留时间 852 | 853 | #### 4.8.1 数据设计 business 854 | 855 | ```json 856 | { 857 | "title": "前端监控系统", 858 | "url": "http://localhost:8080/", 859 | "timestamp": "1590829304423", 860 | "userAgent": "chrome", 861 | "kind": "business", 862 | "type": "pv", 863 | "effectiveType": "4g", 864 | "rtt": "50", 865 | "screen": "2049x1152" 866 | } 867 | ``` 868 | 869 | #### 4.8.2 PV、UV、用户停留时间 870 | 871 | PV(page view) 是页面浏览量,UV(Unique visitor)用户访问量。PV 只要访问一次页面就算一次,UV 同一天内多次访问只算一次。 872 | 873 | 对于前端来说,只要每次进入页面上报一次 PV 就行,UV 的统计放在服务端来做,主要是分析上报的数据来统计得出 UV。 874 | 875 | ```js 876 | import tracker from "../util/tracker"; 877 | export function pv() { 878 | tracker.send({ 879 | kind: "business", 880 | type: "pv", 881 | startTime: performance.now(), 882 | pageURL: getPageURL(), 883 | referrer: document.referrer, 884 | uuid: getUUID(), 885 | }); 886 | let startTime = Date.now(); 887 | window.addEventListener( 888 | "beforeunload", 889 | () => { 890 | let stayTime = Date.now() - startTime; 891 | tracker.send({ 892 | kind: "business", 893 | type: "stayTime", 894 | stayTime, 895 | pageURL: getPageURL(), 896 | uuid: getUUID(), 897 | }); 898 | }, 899 | false 900 | ); 901 | } 902 | ``` 903 | 904 |
905 | 906 | ### 扩展问题 907 | 908 | 1. 性能监控指标 909 | 1. 前端怎么做性能监控 910 | 1. 线上错误监控怎么做 911 | 1. 导致内存泄漏的方法,怎么监控内存泄漏 912 | 1. Node 怎么做性能监控 913 | 914 | #### 1. 性能监控指标 915 | 916 | | 指标 | 名称 | 解释 | 917 | | --------- | ----- | ----- | 918 | | FP | First-Paint 首次渲染 |表示浏览器从开始请求网站到屏幕渲染第一个像素点的时间| 919 | | FCP | First-Contentful-Paint 首次内容渲染| 表示浏览器渲染出第一个内容的时间,这个内容可以是文本、图片或SVG元素等等,不包括iframe和白色背景的canvas元素| 920 | | SI | Speed Index 速度指数| 表明了网页内容的可见填充速度| 921 | | LCP | Largest Contentful Paint 最大内容绘制 | 标记了渲染出最大文本或图片的时间| 922 | | TTI | Time to Interactive 可交互时间 | 页面从开始加载到主要子资源完成渲染,并能够快速、可靠的响应用户输入所需的时间| 923 | | TBT | Total Blocking Time 总阻塞时间 | 测量 FCP 与 TTI 之间的总时间,这期间,主线程被阻塞的时间过长,无法作出输入响应| 924 | | FID | First Input Delay 首次输入延迟 | 测量加载响应度的一个以用户为中心的重要指标| 925 | | CLS | Cumulative Layout Shift 累积布局偏移 | 测量的是整个页面生命周期内发生的所有意外布局偏移中最大一连串的布局偏移分数| 926 | | DCL | DOMContentLoaded | 当初始的 HTML 文档被完全加载和解析完成之后,DOMContentLoaded 事件被触发,而无需等待样式表、图像和子框架的完成加载| 927 | | L | Load | 检测一个完全加载的页面,页面的html、css、js、图片等资源都已经加载完之后才会触发 load 事件| 928 | 929 | 930 | #### 2. 前端怎么做性能监控 931 | 932 | * FP、FCP、LCP、CLS、FID、FMP 可通过 PerformanceObserver获取 933 | * TCP连接耗时、首字节到达时间、response响应耗时、DOM解析渲染的时间、TTI、DCL、L等可通过performance.timing获取 934 | * 长任务监听,PerformanceObserver 监听 longTask 935 | 936 | ```js 937 | const { 938 | fetchStart, 939 | connectStart, 940 | connectEnd, 941 | requestStart, 942 | responseStart, 943 | responseEnd, 944 | domLoading, 945 | domInteractive, 946 | domContentLoadedEventStart, 947 | domContentLoadedEventEnd, 948 | loadEventStart, 949 | } = window.performance.timing; 950 | const obj = { 951 | kind: "experience", // 用户体验指标 952 | type: "timing", // 统计每个阶段的时间 953 | dnsTime: domainLookupEnd - domainLookupStart, // DNS查询时间 954 | connectTime: connectEnd - connectStart, // TCP连接耗时 955 | ttfbTime: responseStart - requestStart, // 首字节到达时间 956 | responseTime: responseEnd - responseStart, // response响应耗时 957 | parseDOMTime: loadEventStart - domLoading, // DOM解析渲染的时间 958 | domContentLoadedTime: 959 | domContentLoadedEventEnd - domContentLoadedEventStart, // DOMContentLoaded事件回调耗时 960 | timeToInteractive: domInteractive - fetchStart, // 首次可交互时间 961 | loadTime: loadEventStart - fetchStart, // 完整的加载时间 962 | } 963 | ``` 964 | 965 | ![image.png](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b004ba190b0c49a99959539bc7e79a8c~tplv-k3u1fbpfcp-watermark.image?) 966 | 967 | #### 3. 线上错误监控怎么做 968 | 969 | * 资源加载错误 window.addEventListener('error') 判断e.target.src || href 970 | * js运行时错误 window.addEventListener('error') 971 | * promise异常 window.addEventListener('unhandledrejection') 972 | * 接口异常 重写xhr 的 open send方法,监控 load、error、abort,进行上报 973 | 974 | #### 4. 导致内存泄漏的方法,怎么监控内存泄漏 975 | 976 | * 全局变量 977 | * 被遗忘的定时器 978 | * 脱离Dom的引用 979 | * 闭包 980 | 981 | 监控内存泄漏 982 | 983 | * window.performance.memory 984 | * 开发阶段 985 | * 浏览器的 Performance 986 | * 移动端可使用 PerformanceDog 987 | 988 | ![image.png](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/090ce23e973e4a29820d2f1027736dc9~tplv-k3u1fbpfcp-watermark.image?) 989 | 990 | #### 5. Node 怎么做性能监控 991 | 992 | 1. **日志监控** 可以通过监控异常日志的变动,将新增的异常类型和数量反映出来 监控日志可以实现pv和uv的监控,通过pv/uv的监控,可以知道使用者们的使用习惯,预知访问高峰 993 | 2. **响应时间** 响应时间也是一个需要监控的点。一旦系统的某个子系统出现异常或者性能瓶颈将会导致系统的响应时间变长。响应时间可以在nginx一类的反向代理上监控,也可以通过应用自己产生访问日志来监控 994 | 3. **进程监控** 监控日志和响应时间都能较好地监控到系统的状态,但是它们的前提是系统是运行状态的,所以监控进程是比前两者更为紧要的任务。监控进程一般是检查操作系统中运行的应用进程数,比如对于采用多进程架构的web应用,就需要检查工作进程的数,如果低于低估值,就应当发出警报 995 | 4. **磁盘监控** 磁盘监控主要是监控磁盘的用量。由于写日志频繁的缘故,磁盘空间渐渐被用光。一旦磁盘不够用将会引发系统的各种问题,给磁盘的使用量设置一个上限,一旦磁盘用量超过警戒值,服务器的管理者应该整理日志或者清理磁盘 996 | 5. **内存监控** 对于node而言,一旦出现内存泄漏,不是那么容易排查的。监控服务器的内存使用情况。如果内存只升不降,那么铁定存在内存泄漏问题。符合正常的内存使用应该是有升有降,在访问量大的时候上升,在访问量回落的时候,占用量也随之回落。监控内存异常时间也是防止系统出现异常的好方法。如果突然出现内存异常,也能够追踪到近期的哪些代码改动导致的问题 997 | 6. **cpu占用监控** 服务器的cpu占用监控也是必不可少的项,cpu的使用分为用户态、内核态、IOWait等。如果用户态cpu使用率较高,说明服务器上的应用需要大量的cpu开销;如果内核态cpu使用率较高,说明服务器需要花费大量时间进行进程调度或者系统调用;IOWait使用率反映的是cpu等待磁盘I/O操作;cpu的使用率中,用户态小于70%,内核态小于35%且整体小于70%,处于正常范围。监控cpu占用情况,可以帮助分析应用程序在实际业务中的状况。合理设置监控阈值能够很好地预警 998 | 7. **cpu load监控** cpu load又称cpu平均负载。它用来描述操作系统当前的繁忙程度,又简单地理解为cpu在单位时间内正在使用和等待使用cpu的平均任务数。它有3个指标,即1分钟的平均负载、5分钟的平均负载,15分钟的平均负载。cpu load过高说明进程数量过多,这在node中可能体现在用于进程模块反复启动新的进程。监控该值可以防止意外发生 999 | 8. **I/O负载** I/O负载指的主要是磁盘I/O。反应的是磁盘上的读写情况,对于node编写的应用,主要是面向网络业务,是不太可能出现I/O负载过高的情况,大多数的I/O压力来自于数据库。不管node进程是否与数据库或其他I/O密集的应用共同处理相同的服务器,我们都应该监控该值防止意外情况 1000 | 9. **网络监控** 虽然网络流量监控的优先级没有上述项目那么高,但还是需要对流量进行监控并设置流量上限值。即便应用突然受到用户的青睐,流量暴涨的时候也可以通过数值感知到网站的宣传是否有效。一旦流量超过警戒值,开发者就应当找出流量增长的原因。对于正常增长,应当评估是否该增加硬件设备来为更多用户提供服务。网络流量监控的两个主要指标是流入流量和流出流量 1001 | * 应用状态监控 除了这些硬性需要检测的指标之外,应用还应该提供一种机制来反馈其自身的状态信息,外部监控将会持续性地调用应用地反馈接口来检查它地健康状态。 1002 | * dns监控 dns是网络应用的基础,在实际的对外服务产品中,多数都对域名有依赖。dns故障导致产品出现大面积影响的事件并不少见。由于dns服务通常是稳定的,容易让人忽略,但是一旦出现故障,就可能是史无前例的故障。对于产品的稳定性,域名dns状态也需要加入监控。 1003 | 1004 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@discoveryjs/json-ext@^0.5.0": 6 | version "0.5.5" 7 | resolved "https://registry.nlark.com/@discoveryjs/json-ext/download/@discoveryjs/json-ext-0.5.5.tgz?cache=0&sync_timestamp=1631662047041&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40discoveryjs%2Fjson-ext%2Fdownload%2F%40discoveryjs%2Fjson-ext-0.5.5.tgz#9283c9ce5b289a3c4f61c12757469e59377f81f3" 8 | integrity sha1-koPJzlsomjxPYcEnV0aeWTd/gfM= 9 | 10 | "@nodelib/fs.scandir@2.1.5": 11 | version "2.1.5" 12 | resolved "https://registry.nlark.com/@nodelib/fs.scandir/download/@nodelib/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" 13 | integrity sha1-dhnC6yGyVIP20WdUi0z9WnSIw9U= 14 | dependencies: 15 | "@nodelib/fs.stat" "2.0.5" 16 | run-parallel "^1.1.9" 17 | 18 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 19 | version "2.0.5" 20 | resolved "https://registry.nlark.com/@nodelib/fs.stat/download/@nodelib/fs.stat-2.0.5.tgz?cache=0&sync_timestamp=1622792655362&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40nodelib%2Ffs.stat%2Fdownload%2F%40nodelib%2Ffs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 21 | integrity sha1-W9Jir5Tp0lvR5xsF3u1Eh2oiLos= 22 | 23 | "@nodelib/fs.walk@^1.2.3": 24 | version "1.2.8" 25 | resolved "https://registry.nlark.com/@nodelib/fs.walk/download/@nodelib/fs.walk-1.2.8.tgz?cache=0&sync_timestamp=1625769815389&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40nodelib%2Ffs.walk%2Fdownload%2F%40nodelib%2Ffs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" 26 | integrity sha1-6Vc36LtnRt3t9pxVaVNJTxlv5po= 27 | dependencies: 28 | "@nodelib/fs.scandir" "2.1.5" 29 | fastq "^1.6.0" 30 | 31 | "@types/eslint-scope@^3.7.0": 32 | version "3.7.1" 33 | resolved "https://registry.nlark.com/@types/eslint-scope/download/@types/eslint-scope-3.7.1.tgz?cache=0&sync_timestamp=1629707496537&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Feslint-scope%2Fdownload%2F%40types%2Feslint-scope-3.7.1.tgz#8dc390a7b4f9dd9f1284629efce982e41612116e" 34 | integrity sha1-jcOQp7T53Z8ShGKe/OmC5BYSEW4= 35 | dependencies: 36 | "@types/eslint" "*" 37 | "@types/estree" "*" 38 | 39 | "@types/eslint@*": 40 | version "7.28.2" 41 | resolved "https://registry.npmmirror.com/@types/eslint/download/@types/eslint-7.28.2.tgz?cache=0&sync_timestamp=1635092369821&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40types%2Feslint%2Fdownload%2F%40types%2Feslint-7.28.2.tgz#0ff2947cdd305897c52d5372294e8c76f351db68" 42 | integrity sha1-D/KUfN0wWJfFLVNyKU6MdvNR22g= 43 | dependencies: 44 | "@types/estree" "*" 45 | "@types/json-schema" "*" 46 | 47 | "@types/estree@*", "@types/estree@^0.0.50": 48 | version "0.0.50" 49 | resolved "https://registry.nlark.com/@types/estree/download/@types/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" 50 | integrity sha1-Hgyqk2TT/M0pMcPtlv2+ql1MyoM= 51 | 52 | "@types/html-minifier-terser@^6.0.0": 53 | version "6.0.0" 54 | resolved "https://registry.nlark.com/@types/html-minifier-terser/download/@types/html-minifier-terser-6.0.0.tgz#563c1c6c132cd204e71512f9c0b394ff90d3fae7" 55 | integrity sha1-VjwcbBMs0gTnFRL5wLOU/5DT+uc= 56 | 57 | "@types/http-proxy@^1.17.5": 58 | version "1.17.7" 59 | resolved "https://registry.nlark.com/@types/http-proxy/download/@types/http-proxy-1.17.7.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fhttp-proxy%2Fdownload%2F%40types%2Fhttp-proxy-1.17.7.tgz#30ea85cc2c868368352a37f0d0d3581e24834c6f" 60 | integrity sha1-MOqFzCyGg2g1Kjfw0NNYHiSDTG8= 61 | dependencies: 62 | "@types/node" "*" 63 | 64 | "@types/json-schema@*", "@types/json-schema@^7.0.8": 65 | version "7.0.9" 66 | resolved "https://registry.nlark.com/@types/json-schema/download/@types/json-schema-7.0.9.tgz?cache=0&sync_timestamp=1629708189890&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fjson-schema%2Fdownload%2F%40types%2Fjson-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" 67 | integrity sha1-l+3JA36gw4WFMgsolk3eOznkZg0= 68 | 69 | "@types/node@*": 70 | version "16.11.6" 71 | resolved "https://registry.npmmirror.com/@types/node/download/@types/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" 72 | integrity sha1-a+96KgrWhM9ukPz+Mc7KvZzgo64= 73 | 74 | "@types/retry@^0.12.0": 75 | version "0.12.1" 76 | resolved "https://registry.nlark.com/@types/retry/download/@types/retry-0.12.1.tgz?cache=0&sync_timestamp=1629709126376&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fretry%2Fdownload%2F%40types%2Fretry-0.12.1.tgz#d8f1c0d0dc23afad6dc16a9e993a0865774b4065" 77 | integrity sha1-2PHA0Nwjr61twWqemToIZXdLQGU= 78 | 79 | "@webassemblyjs/ast@1.11.1": 80 | version "1.11.1" 81 | resolved "https://registry.nlark.com/@webassemblyjs/ast/download/@webassemblyjs/ast-1.11.1.tgz?cache=0&sync_timestamp=1625473459015&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fast%2Fdownload%2F%40webassemblyjs%2Fast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" 82 | integrity sha1-K/12fq4aaZb0Mv9+jX/HVnnAtqc= 83 | dependencies: 84 | "@webassemblyjs/helper-numbers" "1.11.1" 85 | "@webassemblyjs/helper-wasm-bytecode" "1.11.1" 86 | 87 | "@webassemblyjs/floating-point-hex-parser@1.11.1": 88 | version "1.11.1" 89 | resolved "https://registry.nlark.com/@webassemblyjs/floating-point-hex-parser/download/@webassemblyjs/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" 90 | integrity sha1-9sYacF8P16auyqToGY8j2dwXnk8= 91 | 92 | "@webassemblyjs/helper-api-error@1.11.1": 93 | version "1.11.1" 94 | resolved "https://registry.nlark.com/@webassemblyjs/helper-api-error/download/@webassemblyjs/helper-api-error-1.11.1.tgz?cache=0&sync_timestamp=1625473346773&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fhelper-api-error%2Fdownload%2F%40webassemblyjs%2Fhelper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" 95 | integrity sha1-GmMZLYeI5cASgAump6RscFKI/RY= 96 | 97 | "@webassemblyjs/helper-buffer@1.11.1": 98 | version "1.11.1" 99 | resolved "https://registry.nlark.com/@webassemblyjs/helper-buffer/download/@webassemblyjs/helper-buffer-1.11.1.tgz?cache=0&sync_timestamp=1625473344792&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fhelper-buffer%2Fdownload%2F%40webassemblyjs%2Fhelper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" 100 | integrity sha1-gyqQDrREiEzemnytRn+BUA9eWrU= 101 | 102 | "@webassemblyjs/helper-numbers@1.11.1": 103 | version "1.11.1" 104 | resolved "https://registry.nlark.com/@webassemblyjs/helper-numbers/download/@webassemblyjs/helper-numbers-1.11.1.tgz?cache=0&sync_timestamp=1625473485159&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fhelper-numbers%2Fdownload%2F%40webassemblyjs%2Fhelper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" 105 | integrity sha1-ZNgdohn7u6HjvRv8dPboxOEKYq4= 106 | dependencies: 107 | "@webassemblyjs/floating-point-hex-parser" "1.11.1" 108 | "@webassemblyjs/helper-api-error" "1.11.1" 109 | "@xtuc/long" "4.2.2" 110 | 111 | "@webassemblyjs/helper-wasm-bytecode@1.11.1": 112 | version "1.11.1" 113 | resolved "https://registry.nlark.com/@webassemblyjs/helper-wasm-bytecode/download/@webassemblyjs/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" 114 | integrity sha1-8ygkHkHnsZnQsgwY6IQpxEMyleE= 115 | 116 | "@webassemblyjs/helper-wasm-section@1.11.1": 117 | version "1.11.1" 118 | resolved "https://registry.nlark.com/@webassemblyjs/helper-wasm-section/download/@webassemblyjs/helper-wasm-section-1.11.1.tgz?cache=0&sync_timestamp=1625473466570&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fhelper-wasm-section%2Fdownload%2F%40webassemblyjs%2Fhelper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" 119 | integrity sha1-Ie4GWntjXzGec48N1zv72igcCXo= 120 | dependencies: 121 | "@webassemblyjs/ast" "1.11.1" 122 | "@webassemblyjs/helper-buffer" "1.11.1" 123 | "@webassemblyjs/helper-wasm-bytecode" "1.11.1" 124 | "@webassemblyjs/wasm-gen" "1.11.1" 125 | 126 | "@webassemblyjs/ieee754@1.11.1": 127 | version "1.11.1" 128 | resolved "https://registry.nlark.com/@webassemblyjs/ieee754/download/@webassemblyjs/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" 129 | integrity sha1-ljkp6bvQVwnn4SJDoJkYCBKZJhQ= 130 | dependencies: 131 | "@xtuc/ieee754" "^1.2.0" 132 | 133 | "@webassemblyjs/leb128@1.11.1": 134 | version "1.11.1" 135 | resolved "https://registry.nlark.com/@webassemblyjs/leb128/download/@webassemblyjs/leb128-1.11.1.tgz?cache=0&sync_timestamp=1625473342433&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fleb128%2Fdownload%2F%40webassemblyjs%2Fleb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" 136 | integrity sha1-zoFLRVdOk9drrh+yZEq5zdlSeqU= 137 | dependencies: 138 | "@xtuc/long" "4.2.2" 139 | 140 | "@webassemblyjs/utf8@1.11.1": 141 | version "1.11.1" 142 | resolved "https://registry.nlark.com/@webassemblyjs/utf8/download/@webassemblyjs/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" 143 | integrity sha1-0fi3ZDaefG5rrjUOhU3smlnwo/8= 144 | 145 | "@webassemblyjs/wasm-edit@1.11.1": 146 | version "1.11.1" 147 | resolved "https://registry.nlark.com/@webassemblyjs/wasm-edit/download/@webassemblyjs/wasm-edit-1.11.1.tgz?cache=0&sync_timestamp=1625473463093&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fwasm-edit%2Fdownload%2F%40webassemblyjs%2Fwasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" 148 | integrity sha1-rSBuv0v5WgWM6YgKjAksXeyBk9Y= 149 | dependencies: 150 | "@webassemblyjs/ast" "1.11.1" 151 | "@webassemblyjs/helper-buffer" "1.11.1" 152 | "@webassemblyjs/helper-wasm-bytecode" "1.11.1" 153 | "@webassemblyjs/helper-wasm-section" "1.11.1" 154 | "@webassemblyjs/wasm-gen" "1.11.1" 155 | "@webassemblyjs/wasm-opt" "1.11.1" 156 | "@webassemblyjs/wasm-parser" "1.11.1" 157 | "@webassemblyjs/wast-printer" "1.11.1" 158 | 159 | "@webassemblyjs/wasm-gen@1.11.1": 160 | version "1.11.1" 161 | resolved "https://registry.nlark.com/@webassemblyjs/wasm-gen/download/@webassemblyjs/wasm-gen-1.11.1.tgz?cache=0&sync_timestamp=1625473361759&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fwasm-gen%2Fdownload%2F%40webassemblyjs%2Fwasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" 162 | integrity sha1-hsXqMEhJdZt9iMR6MvTwOa48j3Y= 163 | dependencies: 164 | "@webassemblyjs/ast" "1.11.1" 165 | "@webassemblyjs/helper-wasm-bytecode" "1.11.1" 166 | "@webassemblyjs/ieee754" "1.11.1" 167 | "@webassemblyjs/leb128" "1.11.1" 168 | "@webassemblyjs/utf8" "1.11.1" 169 | 170 | "@webassemblyjs/wasm-opt@1.11.1": 171 | version "1.11.1" 172 | resolved "https://registry.nlark.com/@webassemblyjs/wasm-opt/download/@webassemblyjs/wasm-opt-1.11.1.tgz?cache=0&sync_timestamp=1625473467198&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fwasm-opt%2Fdownload%2F%40webassemblyjs%2Fwasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" 173 | integrity sha1-ZXtMIgL0zzs0X4pMZGHIwkGJhfI= 174 | dependencies: 175 | "@webassemblyjs/ast" "1.11.1" 176 | "@webassemblyjs/helper-buffer" "1.11.1" 177 | "@webassemblyjs/wasm-gen" "1.11.1" 178 | "@webassemblyjs/wasm-parser" "1.11.1" 179 | 180 | "@webassemblyjs/wasm-parser@1.11.1": 181 | version "1.11.1" 182 | resolved "https://registry.nlark.com/@webassemblyjs/wasm-parser/download/@webassemblyjs/wasm-parser-1.11.1.tgz?cache=0&sync_timestamp=1625473464593&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fwasm-parser%2Fdownload%2F%40webassemblyjs%2Fwasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" 183 | integrity sha1-hspzRTT0F+m9PGfHocddi+QfsZk= 184 | dependencies: 185 | "@webassemblyjs/ast" "1.11.1" 186 | "@webassemblyjs/helper-api-error" "1.11.1" 187 | "@webassemblyjs/helper-wasm-bytecode" "1.11.1" 188 | "@webassemblyjs/ieee754" "1.11.1" 189 | "@webassemblyjs/leb128" "1.11.1" 190 | "@webassemblyjs/utf8" "1.11.1" 191 | 192 | "@webassemblyjs/wast-printer@1.11.1": 193 | version "1.11.1" 194 | resolved "https://registry.nlark.com/@webassemblyjs/wast-printer/download/@webassemblyjs/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" 195 | integrity sha1-0Mc77ajuxUJvEK6O9VzuXnCEwvA= 196 | dependencies: 197 | "@webassemblyjs/ast" "1.11.1" 198 | "@xtuc/long" "4.2.2" 199 | 200 | "@webpack-cli/configtest@^1.1.0": 201 | version "1.1.0" 202 | resolved "https://registry.npmmirror.com/@webpack-cli/configtest/download/@webpack-cli/configtest-1.1.0.tgz?cache=0&sync_timestamp=1633553239176&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40webpack-cli%2Fconfigtest%2Fdownload%2F%40webpack-cli%2Fconfigtest-1.1.0.tgz#8342bef0badfb7dfd3b576f2574ab80c725be043" 203 | integrity sha1-g0K+8Lrft9/TtXbyV0q4DHJb4EM= 204 | 205 | "@webpack-cli/info@^1.4.0": 206 | version "1.4.0" 207 | resolved "https://registry.npmmirror.com/@webpack-cli/info/download/@webpack-cli/info-1.4.0.tgz?cache=0&sync_timestamp=1633553269200&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40webpack-cli%2Finfo%2Fdownload%2F%40webpack-cli%2Finfo-1.4.0.tgz#b9179c3227ab09cbbb149aa733475fcf99430223" 208 | integrity sha1-uRecMierCcu7FJqnM0dfz5lDAiM= 209 | dependencies: 210 | envinfo "^7.7.3" 211 | 212 | "@webpack-cli/serve@^1.6.0": 213 | version "1.6.0" 214 | resolved "https://registry.npmmirror.com/@webpack-cli/serve/download/@webpack-cli/serve-1.6.0.tgz?cache=0&sync_timestamp=1633553365700&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40webpack-cli%2Fserve%2Fdownload%2F%40webpack-cli%2Fserve-1.6.0.tgz#2c275aa05c895eccebbfc34cfb223c6e8bd591a2" 215 | integrity sha1-LCdaoFyJXszrv8NM+yI8bovVkaI= 216 | 217 | "@xtuc/ieee754@^1.2.0": 218 | version "1.2.0" 219 | resolved "https://registry.nlark.com/@xtuc/ieee754/download/@xtuc/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" 220 | integrity sha1-7vAUoxRa5Hehy8AM0eVSM23Ot5A= 221 | 222 | "@xtuc/long@4.2.2": 223 | version "4.2.2" 224 | resolved "https://registry.nlark.com/@xtuc/long/download/@xtuc/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" 225 | integrity sha1-0pHGpOl5ibXGHZrPOWrk/hM6cY0= 226 | 227 | accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: 228 | version "1.3.7" 229 | resolved "https://registry.npm.taobao.org/accepts/download/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" 230 | integrity sha1-UxvHJlF6OytB+FACHGzBXqq1B80= 231 | dependencies: 232 | mime-types "~2.1.24" 233 | negotiator "0.6.2" 234 | 235 | acorn-import-assertions@^1.7.6: 236 | version "1.8.0" 237 | resolved "https://registry.npmmirror.com/acorn-import-assertions/download/acorn-import-assertions-1.8.0.tgz?cache=0&sync_timestamp=1633349660084&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Facorn-import-assertions%2Fdownload%2Facorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" 238 | integrity sha1-uitZOc5iwjjbbZPYHJsRGym4Vek= 239 | 240 | acorn@^8.4.1: 241 | version "8.5.0" 242 | resolved "https://registry.nlark.com/acorn/download/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2" 243 | integrity sha1-RRLMuZs2mMdSWR6btEcuOK1DzuI= 244 | 245 | aggregate-error@^3.0.0: 246 | version "3.1.0" 247 | resolved "https://registry.nlark.com/aggregate-error/download/aggregate-error-3.1.0.tgz?cache=0&sync_timestamp=1622604530325&other_urls=https%3A%2F%2Fregistry.nlark.com%2Faggregate-error%2Fdownload%2Faggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" 248 | integrity sha1-kmcP9Q9TWb23o+DUDQ7DDFc3aHo= 249 | dependencies: 250 | clean-stack "^2.0.0" 251 | indent-string "^4.0.0" 252 | 253 | ajv-keywords@^3.5.2: 254 | version "3.5.2" 255 | resolved "https://registry.nlark.com/ajv-keywords/download/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" 256 | integrity sha1-MfKdpatuANHC0yms97WSlhTVAU0= 257 | 258 | ajv@^6.12.5: 259 | version "6.12.6" 260 | resolved "https://registry.nlark.com/ajv/download/ajv-6.12.6.tgz?cache=0&sync_timestamp=1631470912358&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fajv%2Fdownload%2Fajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 261 | integrity sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ= 262 | dependencies: 263 | fast-deep-equal "^3.1.1" 264 | fast-json-stable-stringify "^2.0.0" 265 | json-schema-traverse "^0.4.1" 266 | uri-js "^4.2.2" 267 | 268 | ansi-html-community@^0.0.8: 269 | version "0.0.8" 270 | resolved "https://registry.nlark.com/ansi-html-community/download/ansi-html-community-0.0.8.tgz?cache=0&sync_timestamp=1631016068950&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-html-community%2Fdownload%2Fansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" 271 | integrity sha1-afvE1sy+OD+XNpNK40w/gpDxv0E= 272 | 273 | ansi-regex@^5.0.1: 274 | version "5.0.1" 275 | resolved "https://registry.nlark.com/ansi-regex/download/ansi-regex-5.0.1.tgz?cache=0&sync_timestamp=1631634988487&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-regex%2Fdownload%2Fansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 276 | integrity sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ= 277 | 278 | ansi-regex@^6.0.1: 279 | version "6.0.1" 280 | resolved "https://registry.nlark.com/ansi-regex/download/ansi-regex-6.0.1.tgz?cache=0&sync_timestamp=1631634988487&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-regex%2Fdownload%2Fansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" 281 | integrity sha1-MYPjj66aZdfLXlOUXNWJfQJgoGo= 282 | 283 | anymatch@~3.1.2: 284 | version "3.1.2" 285 | resolved "https://registry.nlark.com/anymatch/download/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" 286 | integrity sha1-wFV8CWrzLxBhmPT04qODU343hxY= 287 | dependencies: 288 | normalize-path "^3.0.0" 289 | picomatch "^2.0.4" 290 | 291 | array-flatten@1.1.1: 292 | version "1.1.1" 293 | resolved "https://registry.nlark.com/array-flatten/download/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 294 | integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= 295 | 296 | array-flatten@^2.1.0: 297 | version "2.1.2" 298 | resolved "https://registry.nlark.com/array-flatten/download/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" 299 | integrity sha1-JO+AoowaiTYX4hSbDG0NeIKTsJk= 300 | 301 | array-union@^2.1.0: 302 | version "2.1.0" 303 | resolved "https://registry.npm.taobao.org/array-union/download/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" 304 | integrity sha1-t5hCCtvrHego2ErNii4j0+/oXo0= 305 | 306 | async@^2.6.2: 307 | version "2.6.3" 308 | resolved "https://registry.npmmirror.com/async/download/async-2.6.3.tgz?cache=0&sync_timestamp=1635441262651&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fasync%2Fdownload%2Fasync-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" 309 | integrity sha1-1yYl4jRKNlbjo61Pp0n6gymdgv8= 310 | dependencies: 311 | lodash "^4.17.14" 312 | 313 | balanced-match@^1.0.0: 314 | version "1.0.2" 315 | resolved "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 316 | integrity sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4= 317 | 318 | batch@0.6.1: 319 | version "0.6.1" 320 | resolved "https://registry.nlark.com/batch/download/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" 321 | integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= 322 | 323 | binary-extensions@^2.0.0: 324 | version "2.2.0" 325 | resolved "https://registry.nlark.com/binary-extensions/download/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 326 | integrity sha1-dfUC7q+f/eQvyYgpZFvk6na9ni0= 327 | 328 | body-parser@1.19.0: 329 | version "1.19.0" 330 | resolved "https://registry.nlark.com/body-parser/download/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" 331 | integrity sha1-lrJwnlfJxOCab9Zqj9l5hE9p8Io= 332 | dependencies: 333 | bytes "3.1.0" 334 | content-type "~1.0.4" 335 | debug "2.6.9" 336 | depd "~1.1.2" 337 | http-errors "1.7.2" 338 | iconv-lite "0.4.24" 339 | on-finished "~2.3.0" 340 | qs "6.7.0" 341 | raw-body "2.4.0" 342 | type-is "~1.6.17" 343 | 344 | bonjour@^3.5.0: 345 | version "3.5.0" 346 | resolved "https://registry.nlark.com/bonjour/download/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" 347 | integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= 348 | dependencies: 349 | array-flatten "^2.1.0" 350 | deep-equal "^1.0.1" 351 | dns-equal "^1.0.0" 352 | dns-txt "^2.0.2" 353 | multicast-dns "^6.0.1" 354 | multicast-dns-service-types "^1.1.0" 355 | 356 | boolbase@^1.0.0: 357 | version "1.0.0" 358 | resolved "https://registry.nlark.com/boolbase/download/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" 359 | integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= 360 | 361 | brace-expansion@^1.1.7: 362 | version "1.1.11" 363 | resolved "https://registry.nlark.com/brace-expansion/download/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 364 | integrity sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0= 365 | dependencies: 366 | balanced-match "^1.0.0" 367 | concat-map "0.0.1" 368 | 369 | braces@^3.0.1, braces@~3.0.2: 370 | version "3.0.2" 371 | resolved "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 372 | integrity sha1-NFThpGLujVmeI23zNs2epPiv4Qc= 373 | dependencies: 374 | fill-range "^7.0.1" 375 | 376 | browserslist@^4.14.5: 377 | version "4.17.6" 378 | resolved "https://registry.npmmirror.com/browserslist/download/browserslist-4.17.6.tgz#c76be33e7786b497f66cad25a73756c8b938985d" 379 | integrity sha1-x2vjPneGtJf2bK0lpzdWyLk4mF0= 380 | dependencies: 381 | caniuse-lite "^1.0.30001274" 382 | electron-to-chromium "^1.3.886" 383 | escalade "^3.1.1" 384 | node-releases "^2.0.1" 385 | picocolors "^1.0.0" 386 | 387 | buffer-from@^1.0.0: 388 | version "1.1.2" 389 | resolved "https://registry.nlark.com/buffer-from/download/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" 390 | integrity sha1-KxRqb9cugLT1XSVfNe1Zo6mkG9U= 391 | 392 | buffer-indexof@^1.0.0: 393 | version "1.1.1" 394 | resolved "https://registry.nlark.com/buffer-indexof/download/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" 395 | integrity sha1-Uvq8xqYG0aADAoAmSO9o9jnaJow= 396 | 397 | bytes@3.0.0: 398 | version "3.0.0" 399 | resolved "https://registry.npm.taobao.org/bytes/download/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" 400 | integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= 401 | 402 | bytes@3.1.0: 403 | version "3.1.0" 404 | resolved "https://registry.npm.taobao.org/bytes/download/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" 405 | integrity sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY= 406 | 407 | call-bind@^1.0.2: 408 | version "1.0.2" 409 | resolved "https://registry.nlark.com/call-bind/download/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" 410 | integrity sha1-sdTonmiBGcPJqQOtMKuy9qkZvjw= 411 | dependencies: 412 | function-bind "^1.1.1" 413 | get-intrinsic "^1.0.2" 414 | 415 | camel-case@^4.1.2: 416 | version "4.1.2" 417 | resolved "https://registry.nlark.com/camel-case/download/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" 418 | integrity sha1-lygHKpVPgFIoIlpt7qazhGHhvVo= 419 | dependencies: 420 | pascal-case "^3.1.2" 421 | tslib "^2.0.3" 422 | 423 | caniuse-lite@^1.0.30001274: 424 | version "1.0.30001278" 425 | resolved "https://registry.npmmirror.com/caniuse-lite/download/caniuse-lite-1.0.30001278.tgz?cache=0&sync_timestamp=1636095309539&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcaniuse-lite%2Fdownload%2Fcaniuse-lite-1.0.30001278.tgz#51cafc858df77d966b17f59b5839250b24417fff" 426 | integrity sha1-Ucr8hY33fZZrF/WbWDklCyRBf/8= 427 | 428 | chokidar@^3.5.2: 429 | version "3.5.2" 430 | resolved "https://registry.nlark.com/chokidar/download/chokidar-3.5.2.tgz?cache=0&sync_timestamp=1623763535523&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchokidar%2Fdownload%2Fchokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" 431 | integrity sha1-26OXb8rbAW9m/TZQIdkWANAcHnU= 432 | dependencies: 433 | anymatch "~3.1.2" 434 | braces "~3.0.2" 435 | glob-parent "~5.1.2" 436 | is-binary-path "~2.1.0" 437 | is-glob "~4.0.1" 438 | normalize-path "~3.0.0" 439 | readdirp "~3.6.0" 440 | optionalDependencies: 441 | fsevents "~2.3.2" 442 | 443 | chrome-trace-event@^1.0.2: 444 | version "1.0.3" 445 | resolved "https://registry.nlark.com/chrome-trace-event/download/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" 446 | integrity sha1-EBXs7UdB4V0GZkqVfbv1DQQeJqw= 447 | 448 | clean-css@^5.1.5: 449 | version "5.2.2" 450 | resolved "https://registry.npmmirror.com/clean-css/download/clean-css-5.2.2.tgz?cache=0&sync_timestamp=1634992314911&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fclean-css%2Fdownload%2Fclean-css-5.2.2.tgz#d3a7c6ee2511011e051719838bdcf8314dc4548d" 451 | integrity sha1-06fG7iURAR4FFxmDi9z4MU3EVI0= 452 | dependencies: 453 | source-map "~0.6.0" 454 | 455 | clean-stack@^2.0.0: 456 | version "2.2.0" 457 | resolved "https://registry.nlark.com/clean-stack/download/clean-stack-2.2.0.tgz?cache=0&sync_timestamp=1622605328444&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fclean-stack%2Fdownload%2Fclean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" 458 | integrity sha1-7oRy27Ep5yezHooQpCfe6d/kAIs= 459 | 460 | clone-deep@^4.0.1: 461 | version "4.0.1" 462 | resolved "https://registry.nlark.com/clone-deep/download/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" 463 | integrity sha1-wZ/Zvbv4WUK0/ZechNz31fB8I4c= 464 | dependencies: 465 | is-plain-object "^2.0.4" 466 | kind-of "^6.0.2" 467 | shallow-clone "^3.0.0" 468 | 469 | colorette@^2.0.10, colorette@^2.0.14: 470 | version "2.0.16" 471 | resolved "https://registry.npmmirror.com/colorette/download/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" 472 | integrity sha1-cTua+E/bAAE58EVGvUqT9ipQhdo= 473 | 474 | commander@^2.20.0: 475 | version "2.20.3" 476 | resolved "https://registry.npmmirror.com/commander/download/commander-2.20.3.tgz?cache=0&sync_timestamp=1634886396986&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcommander%2Fdownload%2Fcommander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" 477 | integrity sha1-/UhehMA+tIgcIHIrpIA16FMa6zM= 478 | 479 | commander@^7.0.0: 480 | version "7.2.0" 481 | resolved "https://registry.npmmirror.com/commander/download/commander-7.2.0.tgz?cache=0&sync_timestamp=1634886396986&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcommander%2Fdownload%2Fcommander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" 482 | integrity sha1-o2y1fQtQHOEI5NIFWaFQo5HZerc= 483 | 484 | commander@^8.1.0: 485 | version "8.3.0" 486 | resolved "https://registry.npmmirror.com/commander/download/commander-8.3.0.tgz?cache=0&sync_timestamp=1634886396986&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcommander%2Fdownload%2Fcommander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" 487 | integrity sha1-SDfqGy2me5xhamevuw+v7lZ7ymY= 488 | 489 | compressible@~2.0.16: 490 | version "2.0.18" 491 | resolved "https://registry.nlark.com/compressible/download/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" 492 | integrity sha1-r1PMprBw1MPAdQ+9dyhqbXzEb7o= 493 | dependencies: 494 | mime-db ">= 1.43.0 < 2" 495 | 496 | compression@^1.7.4: 497 | version "1.7.4" 498 | resolved "https://registry.npm.taobao.org/compression/download/compression-1.7.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcompression%2Fdownload%2Fcompression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" 499 | integrity sha1-lVI+/xcMpXwpoMpB5v4TH0Hlu48= 500 | dependencies: 501 | accepts "~1.3.5" 502 | bytes "3.0.0" 503 | compressible "~2.0.16" 504 | debug "2.6.9" 505 | on-headers "~1.0.2" 506 | safe-buffer "5.1.2" 507 | vary "~1.1.2" 508 | 509 | concat-map@0.0.1: 510 | version "0.0.1" 511 | resolved "https://registry.nlark.com/concat-map/download/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 512 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 513 | 514 | connect-history-api-fallback@^1.6.0: 515 | version "1.6.0" 516 | resolved "https://registry.nlark.com/connect-history-api-fallback/download/connect-history-api-fallback-1.6.0.tgz?cache=0&sync_timestamp=1618847040596&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fconnect-history-api-fallback%2Fdownload%2Fconnect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" 517 | integrity sha1-izIIk1kwjRERFdgcrT/Oq4iPl7w= 518 | 519 | content-disposition@0.5.3: 520 | version "0.5.3" 521 | resolved "https://registry.nlark.com/content-disposition/download/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" 522 | integrity sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70= 523 | dependencies: 524 | safe-buffer "5.1.2" 525 | 526 | content-type@~1.0.4: 527 | version "1.0.4" 528 | resolved "https://registry.nlark.com/content-type/download/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 529 | integrity sha1-4TjMdeBAxyexlm/l5fjJruJW/js= 530 | 531 | cookie-signature@1.0.6: 532 | version "1.0.6" 533 | resolved "https://registry.npm.taobao.org/cookie-signature/download/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 534 | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= 535 | 536 | cookie@0.4.0: 537 | version "0.4.0" 538 | resolved "https://registry.npm.taobao.org/cookie/download/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" 539 | integrity sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo= 540 | 541 | core-util-is@~1.0.0: 542 | version "1.0.3" 543 | resolved "https://registry.nlark.com/core-util-is/download/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" 544 | integrity sha1-pgQtNjTCsn6TKPg3uWX6yDgI24U= 545 | 546 | cross-spawn@^7.0.3: 547 | version "7.0.3" 548 | resolved "https://registry.nlark.com/cross-spawn/download/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 549 | integrity sha1-9zqFudXUHQRVUcF34ogtSshXKKY= 550 | dependencies: 551 | path-key "^3.1.0" 552 | shebang-command "^2.0.0" 553 | which "^2.0.1" 554 | 555 | css-select@^4.1.3: 556 | version "4.1.3" 557 | resolved "https://registry.nlark.com/css-select/download/css-select-4.1.3.tgz?cache=0&sync_timestamp=1622994276976&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcss-select%2Fdownload%2Fcss-select-4.1.3.tgz#a70440f70317f2669118ad74ff105e65849c7067" 558 | integrity sha1-pwRA9wMX8maRGK10/xBeZYSccGc= 559 | dependencies: 560 | boolbase "^1.0.0" 561 | css-what "^5.0.0" 562 | domhandler "^4.2.0" 563 | domutils "^2.6.0" 564 | nth-check "^2.0.0" 565 | 566 | css-what@^5.0.0: 567 | version "5.1.0" 568 | resolved "https://registry.npmmirror.com/css-what/download/css-what-5.1.0.tgz#3f7b707aadf633baf62c2ceb8579b545bb40f7fe" 569 | integrity sha1-P3tweq32M7r2LCzrhXm1RbtA9/4= 570 | 571 | debug@2.6.9: 572 | version "2.6.9" 573 | resolved "https://registry.nlark.com/debug/download/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 574 | integrity sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8= 575 | dependencies: 576 | ms "2.0.0" 577 | 578 | debug@^3.1.1: 579 | version "3.2.7" 580 | resolved "https://registry.nlark.com/debug/download/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" 581 | integrity sha1-clgLfpFF+zm2Z2+cXl+xALk0F5o= 582 | dependencies: 583 | ms "^2.1.1" 584 | 585 | debug@^4.1.0: 586 | version "4.3.2" 587 | resolved "https://registry.nlark.com/debug/download/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" 588 | integrity sha1-8KScGKyHeeMdSgxgKd+3aHPHQos= 589 | dependencies: 590 | ms "2.1.2" 591 | 592 | deep-equal@^1.0.1: 593 | version "1.1.1" 594 | resolved "https://registry.npm.taobao.org/deep-equal/download/deep-equal-1.1.1.tgz?cache=0&sync_timestamp=1606859714626&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdeep-equal%2Fdownload%2Fdeep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" 595 | integrity sha1-tcmMlCzv+vfLBR4k4UNKJaLmB2o= 596 | dependencies: 597 | is-arguments "^1.0.4" 598 | is-date-object "^1.0.1" 599 | is-regex "^1.0.4" 600 | object-is "^1.0.1" 601 | object-keys "^1.1.1" 602 | regexp.prototype.flags "^1.2.0" 603 | 604 | default-gateway@^6.0.0: 605 | version "6.0.3" 606 | resolved "https://registry.nlark.com/default-gateway/download/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" 607 | integrity sha1-gZSUyIgFO9t0PtvzQ9bN9/KUOnE= 608 | dependencies: 609 | execa "^5.0.0" 610 | 611 | define-lazy-prop@^2.0.0: 612 | version "2.0.0" 613 | resolved "https://registry.nlark.com/define-lazy-prop/download/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" 614 | integrity sha1-P3rkIRKbyqrJvHSQXJigAJ7J7n8= 615 | 616 | define-properties@^1.1.3: 617 | version "1.1.3" 618 | resolved "https://registry.nlark.com/define-properties/download/define-properties-1.1.3.tgz?cache=0&sync_timestamp=1618847174317&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdefine-properties%2Fdownload%2Fdefine-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 619 | integrity sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE= 620 | dependencies: 621 | object-keys "^1.0.12" 622 | 623 | del@^6.0.0: 624 | version "6.0.0" 625 | resolved "https://registry.npm.taobao.org/del/download/del-6.0.0.tgz?cache=0&sync_timestamp=1601076882347&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdel%2Fdownload%2Fdel-6.0.0.tgz#0b40d0332cea743f1614f818be4feb717714c952" 626 | integrity sha1-C0DQMyzqdD8WFPgYvk/rcXcUyVI= 627 | dependencies: 628 | globby "^11.0.1" 629 | graceful-fs "^4.2.4" 630 | is-glob "^4.0.1" 631 | is-path-cwd "^2.2.0" 632 | is-path-inside "^3.0.2" 633 | p-map "^4.0.0" 634 | rimraf "^3.0.2" 635 | slash "^3.0.0" 636 | 637 | depd@~1.1.2: 638 | version "1.1.2" 639 | resolved "https://registry.nlark.com/depd/download/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 640 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 641 | 642 | destroy@~1.0.4: 643 | version "1.0.4" 644 | resolved "https://registry.nlark.com/destroy/download/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 645 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= 646 | 647 | detect-node@^2.0.4: 648 | version "2.1.0" 649 | resolved "https://registry.nlark.com/detect-node/download/detect-node-2.1.0.tgz?cache=0&sync_timestamp=1621146954463&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdetect-node%2Fdownload%2Fdetect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" 650 | integrity sha1-yccHdaScPQO8LAbZpzvlUPl4+LE= 651 | 652 | dir-glob@^3.0.1: 653 | version "3.0.1" 654 | resolved "https://registry.npm.taobao.org/dir-glob/download/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" 655 | integrity sha1-Vtv3PZkqSpO6FYT0U0Bj/S5BcX8= 656 | dependencies: 657 | path-type "^4.0.0" 658 | 659 | dns-equal@^1.0.0: 660 | version "1.0.0" 661 | resolved "https://registry.nlark.com/dns-equal/download/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" 662 | integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= 663 | 664 | dns-packet@^1.3.1: 665 | version "1.3.4" 666 | resolved "https://registry.nlark.com/dns-packet/download/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" 667 | integrity sha1-40VQZYJKJQe6iGxVqJljuxB97G8= 668 | dependencies: 669 | ip "^1.1.0" 670 | safe-buffer "^5.0.1" 671 | 672 | dns-txt@^2.0.2: 673 | version "2.0.2" 674 | resolved "https://registry.nlark.com/dns-txt/download/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" 675 | integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= 676 | dependencies: 677 | buffer-indexof "^1.0.0" 678 | 679 | dom-converter@^0.2.0: 680 | version "0.2.0" 681 | resolved "https://registry.npm.taobao.org/dom-converter/download/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" 682 | integrity sha1-ZyGp2u4uKTaClVtq/kFncWJ7t2g= 683 | dependencies: 684 | utila "~0.4" 685 | 686 | dom-serializer@^1.0.1: 687 | version "1.3.2" 688 | resolved "https://registry.nlark.com/dom-serializer/download/dom-serializer-1.3.2.tgz?cache=0&sync_timestamp=1621256830355&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdom-serializer%2Fdownload%2Fdom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" 689 | integrity sha1-YgZDfTLO767HFhgDIwx6ILwbTZE= 690 | dependencies: 691 | domelementtype "^2.0.1" 692 | domhandler "^4.2.0" 693 | entities "^2.0.0" 694 | 695 | domelementtype@^2.0.1, domelementtype@^2.2.0: 696 | version "2.2.0" 697 | resolved "https://registry.npm.taobao.org/domelementtype/download/domelementtype-2.2.0.tgz?cache=0&sync_timestamp=1617298545989&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomelementtype%2Fdownload%2Fdomelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" 698 | integrity sha1-mgtsJ4LtahxzI9QiZxg9+b2LHVc= 699 | 700 | domhandler@^4.0.0, domhandler@^4.2.0: 701 | version "4.2.2" 702 | resolved "https://registry.nlark.com/domhandler/download/domhandler-4.2.2.tgz?cache=0&sync_timestamp=1630246778110&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdomhandler%2Fdownload%2Fdomhandler-4.2.2.tgz#e825d721d19a86b8c201a35264e226c678ee755f" 703 | integrity sha1-6CXXIdGahrjCAaNSZOImxnjudV8= 704 | dependencies: 705 | domelementtype "^2.2.0" 706 | 707 | domutils@^2.5.2, domutils@^2.6.0: 708 | version "2.8.0" 709 | resolved "https://registry.nlark.com/domutils/download/domutils-2.8.0.tgz?cache=0&sync_timestamp=1630106606599&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdomutils%2Fdownload%2Fdomutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" 710 | integrity sha1-RDfe9dtuLR9dbuhZvZXKfQIEgTU= 711 | dependencies: 712 | dom-serializer "^1.0.1" 713 | domelementtype "^2.2.0" 714 | domhandler "^4.2.0" 715 | 716 | dot-case@^3.0.4: 717 | version "3.0.4" 718 | resolved "https://registry.npm.taobao.org/dot-case/download/dot-case-3.0.4.tgz?cache=0&sync_timestamp=1606867327042&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdot-case%2Fdownload%2Fdot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" 719 | integrity sha1-mytnDQCkMWZ6inW6Kc0bmICc51E= 720 | dependencies: 721 | no-case "^3.0.4" 722 | tslib "^2.0.3" 723 | 724 | ee-first@1.1.1: 725 | version "1.1.1" 726 | resolved "https://registry.nlark.com/ee-first/download/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 727 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 728 | 729 | electron-to-chromium@^1.3.886: 730 | version "1.3.890" 731 | resolved "https://registry.npmmirror.com/electron-to-chromium/download/electron-to-chromium-1.3.890.tgz?cache=0&sync_timestamp=1636167839637&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Felectron-to-chromium%2Fdownload%2Felectron-to-chromium-1.3.890.tgz#e7143b659f73dc4d0512d1ae4baeb0fb9e7bc835" 732 | integrity sha1-5xQ7ZZ9z3E0FEtGuS66w+557yDU= 733 | 734 | encodeurl@~1.0.2: 735 | version "1.0.2" 736 | resolved "https://registry.nlark.com/encodeurl/download/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 737 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 738 | 739 | enhanced-resolve@^5.8.3: 740 | version "5.8.3" 741 | resolved "https://registry.nlark.com/enhanced-resolve/download/enhanced-resolve-5.8.3.tgz?cache=0&sync_timestamp=1632130769099&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fenhanced-resolve%2Fdownload%2Fenhanced-resolve-5.8.3.tgz#6d552d465cce0423f5b3d718511ea53826a7b2f0" 742 | integrity sha1-bVUtRlzOBCP1s9cYUR6lOCansvA= 743 | dependencies: 744 | graceful-fs "^4.2.4" 745 | tapable "^2.2.0" 746 | 747 | entities@^2.0.0: 748 | version "2.2.0" 749 | resolved "https://registry.nlark.com/entities/download/entities-2.2.0.tgz?cache=0&sync_timestamp=1628508189267&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fentities%2Fdownload%2Fentities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" 750 | integrity sha1-CY3JDruD2N/6CJ1VJWs1HTTE2lU= 751 | 752 | envinfo@^7.7.3: 753 | version "7.8.1" 754 | resolved "https://registry.npm.taobao.org/envinfo/download/envinfo-7.8.1.tgz?cache=0&sync_timestamp=1617673061720&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fenvinfo%2Fdownload%2Fenvinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" 755 | integrity sha1-Bjd+Pl9NN5/qesWS1a2JJ+DE1HU= 756 | 757 | es-module-lexer@^0.9.0: 758 | version "0.9.3" 759 | resolved "https://registry.npmmirror.com/es-module-lexer/download/es-module-lexer-0.9.3.tgz?cache=0&sync_timestamp=1633645560577&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fes-module-lexer%2Fdownload%2Fes-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" 760 | integrity sha1-bxPbAMw4QXE32vdDZvU1yOtDjxk= 761 | 762 | escalade@^3.1.1: 763 | version "3.1.1" 764 | resolved "https://registry.nlark.com/escalade/download/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 765 | integrity sha1-2M/ccACWXFoBdLSoLqpcBVJ0LkA= 766 | 767 | escape-html@~1.0.3: 768 | version "1.0.3" 769 | resolved "https://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 770 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 771 | 772 | eslint-scope@5.1.1: 773 | version "5.1.1" 774 | resolved "https://registry.nlark.com/eslint-scope/download/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" 775 | integrity sha1-54blmmbLkrP2wfsNUIqrF0hI9Iw= 776 | dependencies: 777 | esrecurse "^4.3.0" 778 | estraverse "^4.1.1" 779 | 780 | esrecurse@^4.3.0: 781 | version "4.3.0" 782 | resolved "https://registry.nlark.com/esrecurse/download/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 783 | integrity sha1-eteWTWeauyi+5yzsY3WLHF0smSE= 784 | dependencies: 785 | estraverse "^5.2.0" 786 | 787 | estraverse@^4.1.1: 788 | version "4.3.0" 789 | resolved "https://registry.npmmirror.com/estraverse/download/estraverse-4.3.0.tgz?cache=0&sync_timestamp=1635237706876&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Festraverse%2Fdownload%2Festraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" 790 | integrity sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0= 791 | 792 | estraverse@^5.2.0: 793 | version "5.3.0" 794 | resolved "https://registry.npmmirror.com/estraverse/download/estraverse-5.3.0.tgz?cache=0&sync_timestamp=1635237706876&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Festraverse%2Fdownload%2Festraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" 795 | integrity sha1-LupSkHAvJquP5TcDcP+GyWXSESM= 796 | 797 | etag@~1.8.1: 798 | version "1.8.1" 799 | resolved "https://registry.nlark.com/etag/download/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 800 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= 801 | 802 | eventemitter3@^4.0.0: 803 | version "4.0.7" 804 | resolved "https://registry.nlark.com/eventemitter3/download/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" 805 | integrity sha1-Lem2j2Uo1WRO9cWVJqG0oHMGFp8= 806 | 807 | events@^3.2.0: 808 | version "3.3.0" 809 | resolved "https://registry.nlark.com/events/download/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" 810 | integrity sha1-Mala0Kkk4tLEGagTrrLE6HjqdAA= 811 | 812 | execa@^5.0.0: 813 | version "5.1.1" 814 | resolved "https://registry.nlark.com/execa/download/execa-5.1.1.tgz?cache=0&sync_timestamp=1622825396605&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fexeca%2Fdownload%2Fexeca-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" 815 | integrity sha1-+ArZy/Qpj3vR1MlVXCHpN0HEEd0= 816 | dependencies: 817 | cross-spawn "^7.0.3" 818 | get-stream "^6.0.0" 819 | human-signals "^2.1.0" 820 | is-stream "^2.0.0" 821 | merge-stream "^2.0.0" 822 | npm-run-path "^4.0.1" 823 | onetime "^5.1.2" 824 | signal-exit "^3.0.3" 825 | strip-final-newline "^2.0.0" 826 | 827 | express@^4.17.1: 828 | version "4.17.1" 829 | resolved "https://registry.nlark.com/express/download/express-4.17.1.tgz?cache=0&sync_timestamp=1618847120573&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fexpress%2Fdownload%2Fexpress-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" 830 | integrity sha1-RJH8OGBc9R+GKdOcK10Cb5ikwTQ= 831 | dependencies: 832 | accepts "~1.3.7" 833 | array-flatten "1.1.1" 834 | body-parser "1.19.0" 835 | content-disposition "0.5.3" 836 | content-type "~1.0.4" 837 | cookie "0.4.0" 838 | cookie-signature "1.0.6" 839 | debug "2.6.9" 840 | depd "~1.1.2" 841 | encodeurl "~1.0.2" 842 | escape-html "~1.0.3" 843 | etag "~1.8.1" 844 | finalhandler "~1.1.2" 845 | fresh "0.5.2" 846 | merge-descriptors "1.0.1" 847 | methods "~1.1.2" 848 | on-finished "~2.3.0" 849 | parseurl "~1.3.3" 850 | path-to-regexp "0.1.7" 851 | proxy-addr "~2.0.5" 852 | qs "6.7.0" 853 | range-parser "~1.2.1" 854 | safe-buffer "5.1.2" 855 | send "0.17.1" 856 | serve-static "1.14.1" 857 | setprototypeof "1.1.1" 858 | statuses "~1.5.0" 859 | type-is "~1.6.18" 860 | utils-merge "1.0.1" 861 | vary "~1.1.2" 862 | 863 | fast-deep-equal@^3.1.1: 864 | version "3.1.3" 865 | resolved "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 866 | integrity sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU= 867 | 868 | fast-glob@^3.1.1: 869 | version "3.2.7" 870 | resolved "https://registry.nlark.com/fast-glob/download/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" 871 | integrity sha1-/Wy3otfpqnp4RhEehaGW1rL3ZqE= 872 | dependencies: 873 | "@nodelib/fs.stat" "^2.0.2" 874 | "@nodelib/fs.walk" "^1.2.3" 875 | glob-parent "^5.1.2" 876 | merge2 "^1.3.0" 877 | micromatch "^4.0.4" 878 | 879 | fast-json-stable-stringify@^2.0.0: 880 | version "2.1.0" 881 | resolved "https://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 882 | integrity sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM= 883 | 884 | fastest-levenshtein@^1.0.12: 885 | version "1.0.12" 886 | resolved "https://registry.npm.taobao.org/fastest-levenshtein/download/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" 887 | integrity sha1-mZD306iMxan/0fF0V0UlFwDUl+I= 888 | 889 | fastq@^1.6.0: 890 | version "1.13.0" 891 | resolved "https://registry.nlark.com/fastq/download/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" 892 | integrity sha1-YWdg+Ip1Jr38WWt8q4wYk4w2uYw= 893 | dependencies: 894 | reusify "^1.0.4" 895 | 896 | faye-websocket@^0.11.3: 897 | version "0.11.4" 898 | resolved "https://registry.nlark.com/faye-websocket/download/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" 899 | integrity sha1-fw2Sdc/dhqHJY9yLZfzEUe3Lsdo= 900 | dependencies: 901 | websocket-driver ">=0.5.1" 902 | 903 | fill-range@^7.0.1: 904 | version "7.0.1" 905 | resolved "https://registry.nlark.com/fill-range/download/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 906 | integrity sha1-GRmmp8df44ssfHflGYU12prN2kA= 907 | dependencies: 908 | to-regex-range "^5.0.1" 909 | 910 | finalhandler@~1.1.2: 911 | version "1.1.2" 912 | resolved "https://registry.nlark.com/finalhandler/download/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" 913 | integrity sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0= 914 | dependencies: 915 | debug "2.6.9" 916 | encodeurl "~1.0.2" 917 | escape-html "~1.0.3" 918 | on-finished "~2.3.0" 919 | parseurl "~1.3.3" 920 | statuses "~1.5.0" 921 | unpipe "~1.0.0" 922 | 923 | find-up@^4.0.0: 924 | version "4.1.0" 925 | resolved "https://registry.npmmirror.com/find-up/download/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" 926 | integrity sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk= 927 | dependencies: 928 | locate-path "^5.0.0" 929 | path-exists "^4.0.0" 930 | 931 | follow-redirects@^1.0.0: 932 | version "1.14.5" 933 | resolved "https://registry.npmmirror.com/follow-redirects/download/follow-redirects-1.14.5.tgz?cache=0&sync_timestamp=1635857764332&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ffollow-redirects%2Fdownload%2Ffollow-redirects-1.14.5.tgz#f09a5848981d3c772b5392309778523f8d85c381" 934 | integrity sha1-8JpYSJgdPHcrU5Iwl3hSP42Fw4E= 935 | 936 | forwarded@0.2.0: 937 | version "0.2.0" 938 | resolved "https://registry.nlark.com/forwarded/download/forwarded-0.2.0.tgz?cache=0&sync_timestamp=1622503408398&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fforwarded%2Fdownload%2Fforwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" 939 | integrity sha1-ImmTZCiq1MFcfr6XeahL8LKoGBE= 940 | 941 | fresh@0.5.2: 942 | version "0.5.2" 943 | resolved "https://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 944 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 945 | 946 | fs-monkey@1.0.3: 947 | version "1.0.3" 948 | resolved "https://registry.npm.taobao.org/fs-monkey/download/fs-monkey-1.0.3.tgz?cache=0&sync_timestamp=1617593290175&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffs-monkey%2Fdownload%2Ffs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" 949 | integrity sha1-rjrJLVO7Mo7+DpodlUH2rY1I4tM= 950 | 951 | fs.realpath@^1.0.0: 952 | version "1.0.0" 953 | resolved "https://registry.nlark.com/fs.realpath/download/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 954 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 955 | 956 | fsevents@~2.3.2: 957 | version "2.3.2" 958 | resolved "https://registry.nlark.com/fsevents/download/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 959 | integrity sha1-ilJveLj99GI7cJ4Ll1xSwkwC/Ro= 960 | 961 | function-bind@^1.1.1: 962 | version "1.1.1" 963 | resolved "https://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 964 | integrity sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0= 965 | 966 | get-intrinsic@^1.0.2: 967 | version "1.1.1" 968 | resolved "https://registry.nlark.com/get-intrinsic/download/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" 969 | integrity sha1-FfWfN2+FXERpY5SPDSTNNje0q8Y= 970 | dependencies: 971 | function-bind "^1.1.1" 972 | has "^1.0.3" 973 | has-symbols "^1.0.1" 974 | 975 | get-stream@^6.0.0: 976 | version "6.0.1" 977 | resolved "https://registry.npm.taobao.org/get-stream/download/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" 978 | integrity sha1-omLY7vZ6ztV8KFKtYWdSakPL97c= 979 | 980 | glob-parent@^5.1.2, glob-parent@~5.1.2: 981 | version "5.1.2" 982 | resolved "https://registry.npmmirror.com/glob-parent/download/glob-parent-5.1.2.tgz?cache=0&sync_timestamp=1632953697891&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fglob-parent%2Fdownload%2Fglob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 983 | integrity sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ= 984 | dependencies: 985 | is-glob "^4.0.1" 986 | 987 | glob-to-regexp@^0.4.1: 988 | version "0.4.1" 989 | resolved "https://registry.nlark.com/glob-to-regexp/download/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" 990 | integrity sha1-x1KXCHyFG5pXi9IX3VmpL1n+VG4= 991 | 992 | glob@^7.1.3: 993 | version "7.2.0" 994 | resolved "https://registry.npmmirror.com/glob/download/glob-7.2.0.tgz?cache=0&sync_timestamp=1632353796482&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fglob%2Fdownload%2Fglob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" 995 | integrity sha1-0VU1r3cy4C6Uj0xBYovZECk/YCM= 996 | dependencies: 997 | fs.realpath "^1.0.0" 998 | inflight "^1.0.4" 999 | inherits "2" 1000 | minimatch "^3.0.4" 1001 | once "^1.3.0" 1002 | path-is-absolute "^1.0.0" 1003 | 1004 | globby@^11.0.1: 1005 | version "11.0.4" 1006 | resolved "https://registry.nlark.com/globby/download/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" 1007 | integrity sha1-LLr/d8Lypi5x6bKBOme5ejowAaU= 1008 | dependencies: 1009 | array-union "^2.1.0" 1010 | dir-glob "^3.0.1" 1011 | fast-glob "^3.1.1" 1012 | ignore "^5.1.4" 1013 | merge2 "^1.3.0" 1014 | slash "^3.0.0" 1015 | 1016 | graceful-fs@^4.1.2, graceful-fs@^4.2.4, graceful-fs@^4.2.6: 1017 | version "4.2.8" 1018 | resolved "https://registry.nlark.com/graceful-fs/download/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" 1019 | integrity sha1-5BK40z9eAGWTy9PO5t+fLOu+gCo= 1020 | 1021 | handle-thing@^2.0.0: 1022 | version "2.0.1" 1023 | resolved "https://registry.npm.taobao.org/handle-thing/download/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" 1024 | integrity sha1-hX95zjWVgMNA1DCBzGSJcNC7I04= 1025 | 1026 | has-flag@^4.0.0: 1027 | version "4.0.0" 1028 | resolved "https://registry.nlark.com/has-flag/download/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 1029 | integrity sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s= 1030 | 1031 | has-symbols@^1.0.1, has-symbols@^1.0.2: 1032 | version "1.0.2" 1033 | resolved "https://registry.nlark.com/has-symbols/download/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" 1034 | integrity sha1-Fl0wcMADCXUqEjakeTMeOsVvFCM= 1035 | 1036 | has-tostringtag@^1.0.0: 1037 | version "1.0.0" 1038 | resolved "https://registry.nlark.com/has-tostringtag/download/has-tostringtag-1.0.0.tgz?cache=0&sync_timestamp=1628196402801&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-tostringtag%2Fdownload%2Fhas-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" 1039 | integrity sha1-fhM4GKfTlHNPlB5zw9P5KR5liyU= 1040 | dependencies: 1041 | has-symbols "^1.0.2" 1042 | 1043 | has@^1.0.3: 1044 | version "1.0.3" 1045 | resolved "https://registry.nlark.com/has/download/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 1046 | integrity sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y= 1047 | dependencies: 1048 | function-bind "^1.1.1" 1049 | 1050 | he@^1.2.0: 1051 | version "1.2.0" 1052 | resolved "https://registry.nlark.com/he/download/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 1053 | integrity sha1-hK5l+n6vsWX922FWauFLrwVmTw8= 1054 | 1055 | hpack.js@^2.1.6: 1056 | version "2.1.6" 1057 | resolved "https://registry.nlark.com/hpack.js/download/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" 1058 | integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= 1059 | dependencies: 1060 | inherits "^2.0.1" 1061 | obuf "^1.0.0" 1062 | readable-stream "^2.0.1" 1063 | wbuf "^1.1.0" 1064 | 1065 | html-entities@^2.3.2: 1066 | version "2.3.2" 1067 | resolved "https://registry.nlark.com/html-entities/download/html-entities-2.3.2.tgz#760b404685cb1d794e4f4b744332e3b00dcfe488" 1068 | integrity sha1-dgtARoXLHXlOT0t0QzLjsA3P5Ig= 1069 | 1070 | html-minifier-terser@^6.0.2: 1071 | version "6.0.2" 1072 | resolved "https://registry.nlark.com/html-minifier-terser/download/html-minifier-terser-6.0.2.tgz#14059ad64b69bf9f8b8a33f25b53411d8321e75d" 1073 | integrity sha1-FAWa1ktpv5+LijPyW1NBHYMh510= 1074 | dependencies: 1075 | camel-case "^4.1.2" 1076 | clean-css "^5.1.5" 1077 | commander "^8.1.0" 1078 | he "^1.2.0" 1079 | param-case "^3.0.4" 1080 | relateurl "^0.2.7" 1081 | terser "^5.7.2" 1082 | 1083 | html-webpack-plugin@^5.5.0: 1084 | version "5.5.0" 1085 | resolved "https://registry.npmmirror.com/html-webpack-plugin/download/html-webpack-plugin-5.5.0.tgz#c3911936f57681c1f9f4d8b68c158cd9dfe52f50" 1086 | integrity sha1-w5EZNvV2gcH59Ni2jBWM2d/lL1A= 1087 | dependencies: 1088 | "@types/html-minifier-terser" "^6.0.0" 1089 | html-minifier-terser "^6.0.2" 1090 | lodash "^4.17.21" 1091 | pretty-error "^4.0.0" 1092 | tapable "^2.0.0" 1093 | 1094 | htmlparser2@^6.1.0: 1095 | version "6.1.0" 1096 | resolved "https://registry.nlark.com/htmlparser2/download/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" 1097 | integrity sha1-xNditsM3GgXb5l6UrkOp+EX7j7c= 1098 | dependencies: 1099 | domelementtype "^2.0.1" 1100 | domhandler "^4.0.0" 1101 | domutils "^2.5.2" 1102 | entities "^2.0.0" 1103 | 1104 | http-deceiver@^1.2.7: 1105 | version "1.2.7" 1106 | resolved "https://registry.nlark.com/http-deceiver/download/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" 1107 | integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= 1108 | 1109 | http-errors@1.7.2: 1110 | version "1.7.2" 1111 | resolved "https://registry.npm.taobao.org/http-errors/download/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" 1112 | integrity sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8= 1113 | dependencies: 1114 | depd "~1.1.2" 1115 | inherits "2.0.3" 1116 | setprototypeof "1.1.1" 1117 | statuses ">= 1.5.0 < 2" 1118 | toidentifier "1.0.0" 1119 | 1120 | http-errors@~1.6.2: 1121 | version "1.6.3" 1122 | resolved "https://registry.npm.taobao.org/http-errors/download/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" 1123 | integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= 1124 | dependencies: 1125 | depd "~1.1.2" 1126 | inherits "2.0.3" 1127 | setprototypeof "1.1.0" 1128 | statuses ">= 1.4.0 < 2" 1129 | 1130 | http-errors@~1.7.2: 1131 | version "1.7.3" 1132 | resolved "https://registry.npm.taobao.org/http-errors/download/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" 1133 | integrity sha1-bGGeT5xgMIw4UZSYwU+7EKrOuwY= 1134 | dependencies: 1135 | depd "~1.1.2" 1136 | inherits "2.0.4" 1137 | setprototypeof "1.1.1" 1138 | statuses ">= 1.5.0 < 2" 1139 | toidentifier "1.0.0" 1140 | 1141 | http-parser-js@>=0.5.1: 1142 | version "0.5.3" 1143 | resolved "https://registry.npm.taobao.org/http-parser-js/download/http-parser-js-0.5.3.tgz#01d2709c79d41698bb01d4decc5e9da4e4a033d9" 1144 | integrity sha1-AdJwnHnUFpi7AdTezF6dpOSgM9k= 1145 | 1146 | http-proxy-middleware@^2.0.0: 1147 | version "2.0.1" 1148 | resolved "https://registry.nlark.com/http-proxy-middleware/download/http-proxy-middleware-2.0.1.tgz#7ef3417a479fb7666a571e09966c66a39bd2c15f" 1149 | integrity sha1-fvNBekeft2ZqVx4Jlmxmo5vSwV8= 1150 | dependencies: 1151 | "@types/http-proxy" "^1.17.5" 1152 | http-proxy "^1.18.1" 1153 | is-glob "^4.0.1" 1154 | is-plain-obj "^3.0.0" 1155 | micromatch "^4.0.2" 1156 | 1157 | http-proxy@^1.18.1: 1158 | version "1.18.1" 1159 | resolved "https://registry.nlark.com/http-proxy/download/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" 1160 | integrity sha1-QBVB8FNIhLv5UmAzTnL4juOXZUk= 1161 | dependencies: 1162 | eventemitter3 "^4.0.0" 1163 | follow-redirects "^1.0.0" 1164 | requires-port "^1.0.0" 1165 | 1166 | human-signals@^2.1.0: 1167 | version "2.1.0" 1168 | resolved "https://registry.nlark.com/human-signals/download/human-signals-2.1.0.tgz?cache=0&sync_timestamp=1624364695595&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhuman-signals%2Fdownload%2Fhuman-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" 1169 | integrity sha1-3JH8ukLk0G5Kuu0zs+ejwC9RTqA= 1170 | 1171 | iconv-lite@0.4.24: 1172 | version "0.4.24" 1173 | resolved "https://registry.nlark.com/iconv-lite/download/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 1174 | integrity sha1-ICK0sl+93CHS9SSXSkdKr+czkIs= 1175 | dependencies: 1176 | safer-buffer ">= 2.1.2 < 3" 1177 | 1178 | ignore@^5.1.4: 1179 | version "5.1.9" 1180 | resolved "https://registry.npmmirror.com/ignore/download/ignore-5.1.9.tgz?cache=0&sync_timestamp=1635926632542&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fignore%2Fdownload%2Fignore-5.1.9.tgz#9ec1a5cbe8e1446ec60d4420060d43aa6e7382fb" 1181 | integrity sha1-nsGly+jhRG7GDUQgBg1Dqm5zgvs= 1182 | 1183 | import-local@^3.0.2: 1184 | version "3.0.3" 1185 | resolved "https://registry.npmmirror.com/import-local/download/import-local-3.0.3.tgz?cache=0&sync_timestamp=1633327317807&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fimport-local%2Fdownload%2Fimport-local-3.0.3.tgz#4d51c2c495ca9393da259ec66b62e022920211e0" 1186 | integrity sha1-TVHCxJXKk5PaJZ7Ga2LgIpICEeA= 1187 | dependencies: 1188 | pkg-dir "^4.2.0" 1189 | resolve-cwd "^3.0.0" 1190 | 1191 | indent-string@^4.0.0: 1192 | version "4.0.0" 1193 | resolved "https://registry.nlark.com/indent-string/download/indent-string-4.0.0.tgz?cache=0&sync_timestamp=1622604582006&other_urls=https%3A%2F%2Fregistry.nlark.com%2Findent-string%2Fdownload%2Findent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" 1194 | integrity sha1-Yk+PRJfWGbLZdoUx1Y9BIoVNclE= 1195 | 1196 | inflight@^1.0.4: 1197 | version "1.0.6" 1198 | resolved "https://registry.nlark.com/inflight/download/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1199 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 1200 | dependencies: 1201 | once "^1.3.0" 1202 | wrappy "1" 1203 | 1204 | inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: 1205 | version "2.0.4" 1206 | resolved "https://registry.nlark.com/inherits/download/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 1207 | integrity sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w= 1208 | 1209 | inherits@2.0.3: 1210 | version "2.0.3" 1211 | resolved "https://registry.nlark.com/inherits/download/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 1212 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 1213 | 1214 | internal-ip@^6.2.0: 1215 | version "6.2.0" 1216 | resolved "https://registry.npmmirror.com/internal-ip/download/internal-ip-6.2.0.tgz?cache=0&sync_timestamp=1634404775654&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Finternal-ip%2Fdownload%2Finternal-ip-6.2.0.tgz#d5541e79716e406b74ac6b07b856ef18dc1621c1" 1217 | integrity sha1-1VQeeXFuQGt0rGsHuFbvGNwWIcE= 1218 | dependencies: 1219 | default-gateway "^6.0.0" 1220 | ipaddr.js "^1.9.1" 1221 | is-ip "^3.1.0" 1222 | p-event "^4.2.0" 1223 | 1224 | interpret@^2.2.0: 1225 | version "2.2.0" 1226 | resolved "https://registry.npm.taobao.org/interpret/download/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" 1227 | integrity sha1-GnigtZZcQKVBbQB61vUK0nxBffk= 1228 | 1229 | ip-regex@^4.0.0: 1230 | version "4.3.0" 1231 | resolved "https://registry.nlark.com/ip-regex/download/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" 1232 | integrity sha1-aHJ1qw9X+naXj/j03dyKI9WZDbU= 1233 | 1234 | ip@^1.1.0: 1235 | version "1.1.5" 1236 | resolved "https://registry.nlark.com/ip/download/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" 1237 | integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= 1238 | 1239 | ipaddr.js@1.9.1, ipaddr.js@^1.9.1: 1240 | version "1.9.1" 1241 | resolved "https://registry.nlark.com/ipaddr.js/download/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 1242 | integrity sha1-v/OFQ+64mEglB5/zoqjmy9RngbM= 1243 | 1244 | ipaddr.js@^2.0.1: 1245 | version "2.0.1" 1246 | resolved "https://registry.nlark.com/ipaddr.js/download/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" 1247 | integrity sha1-7KJWp6h36Reus2iwp0l930LvgcA= 1248 | 1249 | is-arguments@^1.0.4: 1250 | version "1.1.1" 1251 | resolved "https://registry.nlark.com/is-arguments/download/is-arguments-1.1.1.tgz?cache=0&sync_timestamp=1628201919104&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-arguments%2Fdownload%2Fis-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" 1252 | integrity sha1-FbP4j9oB8ql/7ITKdhpWDxI++ps= 1253 | dependencies: 1254 | call-bind "^1.0.2" 1255 | has-tostringtag "^1.0.0" 1256 | 1257 | is-binary-path@~2.1.0: 1258 | version "2.1.0" 1259 | resolved "https://registry.nlark.com/is-binary-path/download/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 1260 | integrity sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk= 1261 | dependencies: 1262 | binary-extensions "^2.0.0" 1263 | 1264 | is-core-module@^2.2.0: 1265 | version "2.8.0" 1266 | resolved "https://registry.npmmirror.com/is-core-module/download/is-core-module-2.8.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fis-core-module%2Fdownload%2Fis-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548" 1267 | integrity sha1-AyEzbD0JJeSX/Zf12VyxFKXM1Ug= 1268 | dependencies: 1269 | has "^1.0.3" 1270 | 1271 | is-date-object@^1.0.1: 1272 | version "1.0.5" 1273 | resolved "https://registry.nlark.com/is-date-object/download/is-date-object-1.0.5.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-date-object%2Fdownload%2Fis-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" 1274 | integrity sha1-CEHVU25yTCVZe/bqYuG9OCmN8x8= 1275 | dependencies: 1276 | has-tostringtag "^1.0.0" 1277 | 1278 | is-docker@^2.0.0, is-docker@^2.1.1: 1279 | version "2.2.1" 1280 | resolved "https://registry.nlark.com/is-docker/download/is-docker-2.2.1.tgz?cache=0&sync_timestamp=1630451108035&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-docker%2Fdownload%2Fis-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" 1281 | integrity sha1-M+6r4jz+hvFL3kQIoCwM+4U6zao= 1282 | 1283 | is-extglob@^2.1.1: 1284 | version "2.1.1" 1285 | resolved "https://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1286 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 1287 | 1288 | is-glob@^4.0.1, is-glob@~4.0.1: 1289 | version "4.0.3" 1290 | resolved "https://registry.npmmirror.com/is-glob/download/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 1291 | integrity sha1-ZPYeQsu7LuwgcanawLKLoeZdUIQ= 1292 | dependencies: 1293 | is-extglob "^2.1.1" 1294 | 1295 | is-ip@^3.1.0: 1296 | version "3.1.0" 1297 | resolved "https://registry.nlark.com/is-ip/download/is-ip-3.1.0.tgz#2ae5ddfafaf05cb8008a62093cf29734f657c5d8" 1298 | integrity sha1-KuXd+vrwXLgAimIJPPKXNPZXxdg= 1299 | dependencies: 1300 | ip-regex "^4.0.0" 1301 | 1302 | is-number@^7.0.0: 1303 | version "7.0.0" 1304 | resolved "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 1305 | integrity sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss= 1306 | 1307 | is-path-cwd@^2.2.0: 1308 | version "2.2.0" 1309 | resolved "https://registry.nlark.com/is-path-cwd/download/is-path-cwd-2.2.0.tgz?cache=0&sync_timestamp=1628686555851&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-path-cwd%2Fdownload%2Fis-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" 1310 | integrity sha1-Z9Q7gmZKe1GR/ZEZEn6zAASKn9s= 1311 | 1312 | is-path-inside@^3.0.2: 1313 | version "3.0.3" 1314 | resolved "https://registry.nlark.com/is-path-inside/download/is-path-inside-3.0.3.tgz?cache=0&sync_timestamp=1620046845369&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-path-inside%2Fdownload%2Fis-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" 1315 | integrity sha1-0jE2LlOgf/Kw4Op/7QSRYf/RYoM= 1316 | 1317 | is-plain-obj@^3.0.0: 1318 | version "3.0.0" 1319 | resolved "https://registry.npm.taobao.org/is-plain-obj/download/is-plain-obj-3.0.0.tgz?cache=0&sync_timestamp=1618600489644&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-plain-obj%2Fdownload%2Fis-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" 1320 | integrity sha1-r28uoUrFpkYYOlu9tbqrvBVq2dc= 1321 | 1322 | is-plain-object@^2.0.4: 1323 | version "2.0.4" 1324 | resolved "https://registry.nlark.com/is-plain-object/download/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" 1325 | integrity sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc= 1326 | dependencies: 1327 | isobject "^3.0.1" 1328 | 1329 | is-regex@^1.0.4: 1330 | version "1.1.4" 1331 | resolved "https://registry.nlark.com/is-regex/download/is-regex-1.1.4.tgz?cache=0&sync_timestamp=1628221905423&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-regex%2Fdownload%2Fis-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" 1332 | integrity sha1-7vVmPNWfpMCuM5UFMj32hUuxWVg= 1333 | dependencies: 1334 | call-bind "^1.0.2" 1335 | has-tostringtag "^1.0.0" 1336 | 1337 | is-stream@^2.0.0: 1338 | version "2.0.1" 1339 | resolved "https://registry.nlark.com/is-stream/download/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" 1340 | integrity sha1-+sHj1TuXrVqdCunO8jifWBClwHc= 1341 | 1342 | is-wsl@^2.2.0: 1343 | version "2.2.0" 1344 | resolved "https://registry.nlark.com/is-wsl/download/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" 1345 | integrity sha1-dKTHbnfKn9P5MvKQwX6jJs0VcnE= 1346 | dependencies: 1347 | is-docker "^2.0.0" 1348 | 1349 | isarray@~1.0.0: 1350 | version "1.0.0" 1351 | resolved "https://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1352 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 1353 | 1354 | isexe@^2.0.0: 1355 | version "2.0.0" 1356 | resolved "https://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1357 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 1358 | 1359 | isobject@^3.0.1: 1360 | version "3.0.1" 1361 | resolved "https://registry.npm.taobao.org/isobject/download/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" 1362 | integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= 1363 | 1364 | jest-worker@^27.0.6: 1365 | version "27.3.1" 1366 | resolved "https://registry.npmmirror.com/jest-worker/download/jest-worker-27.3.1.tgz?cache=0&sync_timestamp=1634626737887&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fjest-worker%2Fdownload%2Fjest-worker-27.3.1.tgz#0def7feae5b8042be38479799aeb7b5facac24b2" 1367 | integrity sha1-De9/6uW4BCvjhHl5mut7X6ysJLI= 1368 | dependencies: 1369 | "@types/node" "*" 1370 | merge-stream "^2.0.0" 1371 | supports-color "^8.0.0" 1372 | 1373 | json-parse-better-errors@^1.0.2: 1374 | version "1.0.2" 1375 | resolved "https://registry.nlark.com/json-parse-better-errors/download/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" 1376 | integrity sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk= 1377 | 1378 | json-schema-traverse@^0.4.1: 1379 | version "0.4.1" 1380 | resolved "https://registry.nlark.com/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 1381 | integrity sha1-afaofZUTq4u4/mO9sJecRI5oRmA= 1382 | 1383 | kind-of@^6.0.2: 1384 | version "6.0.3" 1385 | resolved "https://registry.nlark.com/kind-of/download/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" 1386 | integrity sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0= 1387 | 1388 | loader-runner@^4.2.0: 1389 | version "4.2.0" 1390 | resolved "https://registry.nlark.com/loader-runner/download/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" 1391 | integrity sha1-1wIjgNZtFMX7HUlriYZOvP1Hg4Q= 1392 | 1393 | locate-path@^5.0.0: 1394 | version "5.0.0" 1395 | resolved "https://registry.nlark.com/locate-path/download/locate-path-5.0.0.tgz?cache=0&sync_timestamp=1629895724478&other_urls=https%3A%2F%2Fregistry.nlark.com%2Flocate-path%2Fdownload%2Flocate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" 1396 | integrity sha1-Gvujlq/WdqbUJQTQpno6frn2KqA= 1397 | dependencies: 1398 | p-locate "^4.1.0" 1399 | 1400 | lodash@^4.17.14, lodash@^4.17.20, lodash@^4.17.21: 1401 | version "4.17.21" 1402 | resolved "https://registry.nlark.com/lodash/download/lodash-4.17.21.tgz?cache=0&sync_timestamp=1624543041613&other_urls=https%3A%2F%2Fregistry.nlark.com%2Flodash%2Fdownload%2Flodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 1403 | integrity sha1-Z5WRxWTDv/quhFTPCz3zcMPWkRw= 1404 | 1405 | lower-case@^2.0.2: 1406 | version "2.0.2" 1407 | resolved "https://registry.nlark.com/lower-case/download/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" 1408 | integrity sha1-b6I3xj29xKgsoP2ILkci3F5jTig= 1409 | dependencies: 1410 | tslib "^2.0.3" 1411 | 1412 | media-typer@0.3.0: 1413 | version "0.3.0" 1414 | resolved "https://registry.nlark.com/media-typer/download/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 1415 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 1416 | 1417 | memfs@^3.2.2: 1418 | version "3.3.0" 1419 | resolved "https://registry.nlark.com/memfs/download/memfs-3.3.0.tgz?cache=0&sync_timestamp=1632066657842&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fmemfs%2Fdownload%2Fmemfs-3.3.0.tgz#4da2d1fc40a04b170a56622c7164c6be2c4cbef2" 1420 | integrity sha1-TaLR/ECgSxcKVmIscWTGvixMvvI= 1421 | dependencies: 1422 | fs-monkey "1.0.3" 1423 | 1424 | merge-descriptors@1.0.1: 1425 | version "1.0.1" 1426 | resolved "https://registry.nlark.com/merge-descriptors/download/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 1427 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= 1428 | 1429 | merge-stream@^2.0.0: 1430 | version "2.0.0" 1431 | resolved "https://registry.npm.taobao.org/merge-stream/download/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" 1432 | integrity sha1-UoI2KaFN0AyXcPtq1H3GMQ8sH2A= 1433 | 1434 | merge2@^1.3.0: 1435 | version "1.4.1" 1436 | resolved "https://registry.npm.taobao.org/merge2/download/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 1437 | integrity sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4= 1438 | 1439 | methods@~1.1.2: 1440 | version "1.1.2" 1441 | resolved "https://registry.nlark.com/methods/download/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 1442 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 1443 | 1444 | micromatch@^4.0.2, micromatch@^4.0.4: 1445 | version "4.0.4" 1446 | resolved "https://registry.npm.taobao.org/micromatch/download/micromatch-4.0.4.tgz?cache=0&sync_timestamp=1618054740956&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmicromatch%2Fdownload%2Fmicromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" 1447 | integrity sha1-iW1Rnf6dsl/OlM63pQCRm/iB6/k= 1448 | dependencies: 1449 | braces "^3.0.1" 1450 | picomatch "^2.2.3" 1451 | 1452 | mime-db@1.50.0, "mime-db@>= 1.43.0 < 2": 1453 | version "1.50.0" 1454 | resolved "https://registry.nlark.com/mime-db/download/mime-db-1.50.0.tgz#abd4ac94e98d3c0e185016c67ab45d5fde40c11f" 1455 | integrity sha1-q9SslOmNPA4YUBbGerRdX95AwR8= 1456 | 1457 | mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24: 1458 | version "2.1.33" 1459 | resolved "https://registry.npmmirror.com/mime-types/download/mime-types-2.1.33.tgz?cache=0&sync_timestamp=1633108176041&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fmime-types%2Fdownload%2Fmime-types-2.1.33.tgz#1fa12a904472fafd068e48d9e8401f74d3f70edb" 1460 | integrity sha1-H6EqkERy+v0GjkjZ6EAfdNP3Dts= 1461 | dependencies: 1462 | mime-db "1.50.0" 1463 | 1464 | mime@1.6.0: 1465 | version "1.6.0" 1466 | resolved "https://registry.npmmirror.com/mime/download/mime-1.6.0.tgz?cache=0&sync_timestamp=1635900726749&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fmime%2Fdownload%2Fmime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 1467 | integrity sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE= 1468 | 1469 | mimic-fn@^2.1.0: 1470 | version "2.1.0" 1471 | resolved "https://registry.npm.taobao.org/mimic-fn/download/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 1472 | integrity sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs= 1473 | 1474 | minimalistic-assert@^1.0.0: 1475 | version "1.0.1" 1476 | resolved "https://registry.nlark.com/minimalistic-assert/download/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" 1477 | integrity sha1-LhlN4ERibUoQ5/f7wAznPoPk1cc= 1478 | 1479 | minimatch@^3.0.4: 1480 | version "3.0.4" 1481 | resolved "https://registry.nlark.com/minimatch/download/minimatch-3.0.4.tgz?cache=0&sync_timestamp=1618846754554&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fminimatch%2Fdownload%2Fminimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1482 | integrity sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM= 1483 | dependencies: 1484 | brace-expansion "^1.1.7" 1485 | 1486 | minimist@^1.2.5: 1487 | version "1.2.5" 1488 | resolved "https://registry.nlark.com/minimist/download/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 1489 | integrity sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI= 1490 | 1491 | mkdirp@^0.5.5: 1492 | version "0.5.5" 1493 | resolved "https://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" 1494 | integrity sha1-2Rzv1i0UNsoPQWIOJRKI1CAJne8= 1495 | dependencies: 1496 | minimist "^1.2.5" 1497 | 1498 | ms@2.0.0: 1499 | version "2.0.0" 1500 | resolved "https://registry.npmmirror.com/ms/download/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1501 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 1502 | 1503 | ms@2.1.1: 1504 | version "2.1.1" 1505 | resolved "https://registry.npmmirror.com/ms/download/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 1506 | integrity sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo= 1507 | 1508 | ms@2.1.2: 1509 | version "2.1.2" 1510 | resolved "https://registry.npmmirror.com/ms/download/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1511 | integrity sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk= 1512 | 1513 | ms@^2.1.1: 1514 | version "2.1.3" 1515 | resolved "https://registry.npmmirror.com/ms/download/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 1516 | integrity sha1-V0yBOM4dK1hh8LRFedut1gxmFbI= 1517 | 1518 | multicast-dns-service-types@^1.1.0: 1519 | version "1.1.0" 1520 | resolved "https://registry.nlark.com/multicast-dns-service-types/download/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" 1521 | integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= 1522 | 1523 | multicast-dns@^6.0.1: 1524 | version "6.2.3" 1525 | resolved "https://registry.npmmirror.com/multicast-dns/download/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" 1526 | integrity sha1-oOx72QVcQoL3kMPIL04o2zsxsik= 1527 | dependencies: 1528 | dns-packet "^1.3.1" 1529 | thunky "^1.0.2" 1530 | 1531 | negotiator@0.6.2: 1532 | version "0.6.2" 1533 | resolved "https://registry.npm.taobao.org/negotiator/download/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" 1534 | integrity sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs= 1535 | 1536 | neo-async@^2.6.2: 1537 | version "2.6.2" 1538 | resolved "https://registry.nlark.com/neo-async/download/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" 1539 | integrity sha1-tKr7k+OustgXTKU88WOrfXMIMF8= 1540 | 1541 | no-case@^3.0.4: 1542 | version "3.0.4" 1543 | resolved "https://registry.npm.taobao.org/no-case/download/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" 1544 | integrity sha1-02H9XJgA9VhVGoNp/A3NRmK2Ek0= 1545 | dependencies: 1546 | lower-case "^2.0.2" 1547 | tslib "^2.0.3" 1548 | 1549 | node-forge@^0.10.0: 1550 | version "0.10.0" 1551 | resolved "https://registry.nlark.com/node-forge/download/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" 1552 | integrity sha1-Mt6ir7Ppkm8C7lzoeUkCaRpna/M= 1553 | 1554 | node-releases@^2.0.1: 1555 | version "2.0.1" 1556 | resolved "https://registry.npmmirror.com/node-releases/download/node-releases-2.0.1.tgz?cache=0&sync_timestamp=1634806960337&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fnode-releases%2Fdownload%2Fnode-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" 1557 | integrity sha1-PR05XyBPHy8ppUNYuftnh2WtL8U= 1558 | 1559 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1560 | version "3.0.0" 1561 | resolved "https://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1562 | integrity sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU= 1563 | 1564 | npm-run-path@^4.0.1: 1565 | version "4.0.1" 1566 | resolved "https://registry.npmmirror.com/npm-run-path/download/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" 1567 | integrity sha1-t+zR5e1T2o43pV4cImnguX7XSOo= 1568 | dependencies: 1569 | path-key "^3.0.0" 1570 | 1571 | nth-check@^2.0.0: 1572 | version "2.0.1" 1573 | resolved "https://registry.nlark.com/nth-check/download/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" 1574 | integrity sha1-Lv4WL1w9oGoolZ+9PbddvuqfD8I= 1575 | dependencies: 1576 | boolbase "^1.0.0" 1577 | 1578 | object-is@^1.0.1: 1579 | version "1.1.5" 1580 | resolved "https://registry.npm.taobao.org/object-is/download/object-is-1.1.5.tgz?cache=0&sync_timestamp=1613857698573&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject-is%2Fdownload%2Fobject-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" 1581 | integrity sha1-ud7qpfx/GEag+uzc7sE45XePU6w= 1582 | dependencies: 1583 | call-bind "^1.0.2" 1584 | define-properties "^1.1.3" 1585 | 1586 | object-keys@^1.0.12, object-keys@^1.1.1: 1587 | version "1.1.1" 1588 | resolved "https://registry.nlark.com/object-keys/download/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 1589 | integrity sha1-HEfyct8nfzsdrwYWd9nILiMixg4= 1590 | 1591 | obuf@^1.0.0, obuf@^1.1.2: 1592 | version "1.1.2" 1593 | resolved "https://registry.nlark.com/obuf/download/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" 1594 | integrity sha1-Cb6jND1BhZ69RGKS0RydTbYZCE4= 1595 | 1596 | on-finished@~2.3.0: 1597 | version "2.3.0" 1598 | resolved "https://registry.nlark.com/on-finished/download/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 1599 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 1600 | dependencies: 1601 | ee-first "1.1.1" 1602 | 1603 | on-headers@~1.0.2: 1604 | version "1.0.2" 1605 | resolved "https://registry.nlark.com/on-headers/download/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" 1606 | integrity sha1-dysK5qqlJcOZ5Imt+tkMQD6zwo8= 1607 | 1608 | once@^1.3.0: 1609 | version "1.4.0" 1610 | resolved "https://registry.nlark.com/once/download/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1611 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1612 | dependencies: 1613 | wrappy "1" 1614 | 1615 | onetime@^5.1.2: 1616 | version "5.1.2" 1617 | resolved "https://registry.npm.taobao.org/onetime/download/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" 1618 | integrity sha1-0Oluu1awdHbfHdnEgG5SN5hcpF4= 1619 | dependencies: 1620 | mimic-fn "^2.1.0" 1621 | 1622 | open@^8.0.9: 1623 | version "8.4.0" 1624 | resolved "https://registry.npmmirror.com/open/download/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" 1625 | integrity sha1-NFMhrhj4E4+CVlqRD9xrOejCRPg= 1626 | dependencies: 1627 | define-lazy-prop "^2.0.0" 1628 | is-docker "^2.1.1" 1629 | is-wsl "^2.2.0" 1630 | 1631 | p-event@^4.2.0: 1632 | version "4.2.0" 1633 | resolved "https://registry.npmmirror.com/p-event/download/p-event-4.2.0.tgz?cache=0&sync_timestamp=1635954052656&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fp-event%2Fdownload%2Fp-event-4.2.0.tgz#af4b049c8acd91ae81083ebd1e6f5cae2044c1b5" 1634 | integrity sha1-r0sEnIrNka6BCD69Hm9criBEwbU= 1635 | dependencies: 1636 | p-timeout "^3.1.0" 1637 | 1638 | p-finally@^1.0.0: 1639 | version "1.0.0" 1640 | resolved "https://registry.npm.taobao.org/p-finally/download/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" 1641 | integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= 1642 | 1643 | p-limit@^2.2.0: 1644 | version "2.3.0" 1645 | resolved "https://registry.nlark.com/p-limit/download/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" 1646 | integrity sha1-PdM8ZHohT9//2DWTPrCG2g3CHbE= 1647 | dependencies: 1648 | p-try "^2.0.0" 1649 | 1650 | p-limit@^3.1.0: 1651 | version "3.1.0" 1652 | resolved "https://registry.nlark.com/p-limit/download/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 1653 | integrity sha1-4drMvnjQ0TiMoYxk/qOOPlfjcGs= 1654 | dependencies: 1655 | yocto-queue "^0.1.0" 1656 | 1657 | p-locate@^4.1.0: 1658 | version "4.1.0" 1659 | resolved "https://registry.nlark.com/p-locate/download/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" 1660 | integrity sha1-o0KLtwiLOmApL2aRkni3wpetTwc= 1661 | dependencies: 1662 | p-limit "^2.2.0" 1663 | 1664 | p-map@^4.0.0: 1665 | version "4.0.0" 1666 | resolved "https://registry.npmmirror.com/p-map/download/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" 1667 | integrity sha1-uy+Vpe2i7BaOySdOBqdHw+KQTSs= 1668 | dependencies: 1669 | aggregate-error "^3.0.0" 1670 | 1671 | p-retry@^4.5.0: 1672 | version "4.6.1" 1673 | resolved "https://registry.npmmirror.com/p-retry/download/p-retry-4.6.1.tgz#8fcddd5cdf7a67a0911a9cf2ef0e5df7f602316c" 1674 | integrity sha1-j83dXN96Z6CRGpzy7w5d9/YCMWw= 1675 | dependencies: 1676 | "@types/retry" "^0.12.0" 1677 | retry "^0.13.1" 1678 | 1679 | p-timeout@^3.1.0: 1680 | version "3.2.0" 1681 | resolved "https://registry.npmmirror.com/p-timeout/download/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" 1682 | integrity sha1-x+F6vJcdKnli74NiazXWNazyPf4= 1683 | dependencies: 1684 | p-finally "^1.0.0" 1685 | 1686 | p-try@^2.0.0: 1687 | version "2.2.0" 1688 | resolved "https://registry.npmmirror.com/p-try/download/p-try-2.2.0.tgz?cache=0&sync_timestamp=1633364462890&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fp-try%2Fdownload%2Fp-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 1689 | integrity sha1-yyhoVA4xPWHeWPr741zpAE1VQOY= 1690 | 1691 | param-case@^3.0.4: 1692 | version "3.0.4" 1693 | resolved "https://registry.nlark.com/param-case/download/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" 1694 | integrity sha1-fRf+SqEr3jTUp32RrPtiGcqtAcU= 1695 | dependencies: 1696 | dot-case "^3.0.4" 1697 | tslib "^2.0.3" 1698 | 1699 | parseurl@~1.3.2, parseurl@~1.3.3: 1700 | version "1.3.3" 1701 | resolved "https://registry.nlark.com/parseurl/download/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 1702 | integrity sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ= 1703 | 1704 | pascal-case@^3.1.2: 1705 | version "3.1.2" 1706 | resolved "https://registry.npm.taobao.org/pascal-case/download/pascal-case-3.1.2.tgz?cache=0&sync_timestamp=1606867325163&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpascal-case%2Fdownload%2Fpascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" 1707 | integrity sha1-tI4O8rmOIF58Ha50fQsVCCN2YOs= 1708 | dependencies: 1709 | no-case "^3.0.4" 1710 | tslib "^2.0.3" 1711 | 1712 | path-exists@^4.0.0: 1713 | version "4.0.0" 1714 | resolved "https://registry.nlark.com/path-exists/download/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1715 | integrity sha1-UTvb4tO5XXdi6METfvoZXGxhtbM= 1716 | 1717 | path-is-absolute@^1.0.0: 1718 | version "1.0.1" 1719 | resolved "https://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1720 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1721 | 1722 | path-key@^3.0.0, path-key@^3.1.0: 1723 | version "3.1.1" 1724 | resolved "https://registry.npm.taobao.org/path-key/download/path-key-3.1.1.tgz?cache=0&sync_timestamp=1617971695678&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpath-key%2Fdownload%2Fpath-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1725 | integrity sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U= 1726 | 1727 | path-parse@^1.0.6: 1728 | version "1.0.7" 1729 | resolved "https://registry.nlark.com/path-parse/download/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 1730 | integrity sha1-+8EUtgykKzDZ2vWFjkvWi77bZzU= 1731 | 1732 | path-to-regexp@0.1.7: 1733 | version "0.1.7" 1734 | resolved "https://registry.npm.taobao.org/path-to-regexp/download/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 1735 | integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= 1736 | 1737 | path-type@^4.0.0: 1738 | version "4.0.0" 1739 | resolved "https://registry.nlark.com/path-type/download/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" 1740 | integrity sha1-hO0BwKe6OAr+CdkKjBgNzZ0DBDs= 1741 | 1742 | picocolors@^1.0.0: 1743 | version "1.0.0" 1744 | resolved "https://registry.npmmirror.com/picocolors/download/picocolors-1.0.0.tgz?cache=0&sync_timestamp=1634093442271&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpicocolors%2Fdownload%2Fpicocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" 1745 | integrity sha1-y1vcdP8/UYkiNur3nWi8RFZKuBw= 1746 | 1747 | picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: 1748 | version "2.3.0" 1749 | resolved "https://registry.nlark.com/picomatch/download/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" 1750 | integrity sha1-8fBh3o9qS/AiiS4tEoI0+5gwKXI= 1751 | 1752 | pkg-dir@^4.2.0: 1753 | version "4.2.0" 1754 | resolved "https://registry.npmmirror.com/pkg-dir/download/pkg-dir-4.2.0.tgz?cache=0&sync_timestamp=1633498133295&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpkg-dir%2Fdownload%2Fpkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" 1755 | integrity sha1-8JkTPfft5CLoHR2ESCcO6z5CYfM= 1756 | dependencies: 1757 | find-up "^4.0.0" 1758 | 1759 | portfinder@^1.0.28: 1760 | version "1.0.28" 1761 | resolved "https://registry.nlark.com/portfinder/download/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" 1762 | integrity sha1-Z8RiKFK9U3TdHdkA93n1NGL6x3g= 1763 | dependencies: 1764 | async "^2.6.2" 1765 | debug "^3.1.1" 1766 | mkdirp "^0.5.5" 1767 | 1768 | pretty-error@^4.0.0: 1769 | version "4.0.0" 1770 | resolved "https://registry.npmmirror.com/pretty-error/download/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" 1771 | integrity sha1-kKcD9G3XI0rbRtD4SCPp0cuPENY= 1772 | dependencies: 1773 | lodash "^4.17.20" 1774 | renderkid "^3.0.0" 1775 | 1776 | process-nextick-args@~2.0.0: 1777 | version "2.0.1" 1778 | resolved "https://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 1779 | integrity sha1-eCDZsWEgzFXKmud5JoCufbptf+I= 1780 | 1781 | proxy-addr@~2.0.5: 1782 | version "2.0.7" 1783 | resolved "https://registry.nlark.com/proxy-addr/download/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" 1784 | integrity sha1-8Z/mnOqzEe65S0LnDowgcPm6ECU= 1785 | dependencies: 1786 | forwarded "0.2.0" 1787 | ipaddr.js "1.9.1" 1788 | 1789 | punycode@1.3.2: 1790 | version "1.3.2" 1791 | resolved "https://registry.nlark.com/punycode/download/punycode-1.3.2.tgz?cache=0&sync_timestamp=1622604519710&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpunycode%2Fdownload%2Fpunycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" 1792 | integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= 1793 | 1794 | punycode@^2.1.0: 1795 | version "2.1.1" 1796 | resolved "https://registry.nlark.com/punycode/download/punycode-2.1.1.tgz?cache=0&sync_timestamp=1622604519710&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpunycode%2Fdownload%2Fpunycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1797 | integrity sha1-tYsBCsQMIsVldhbI0sLALHv0eew= 1798 | 1799 | qs@6.7.0: 1800 | version "6.7.0" 1801 | resolved "https://registry.nlark.com/qs/download/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" 1802 | integrity sha1-QdwaAV49WB8WIXdr4xr7KHapsbw= 1803 | 1804 | querystring@0.2.0: 1805 | version "0.2.0" 1806 | resolved "https://registry.nlark.com/querystring/download/querystring-0.2.0.tgz?cache=0&sync_timestamp=1626179435543&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fquerystring%2Fdownload%2Fquerystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" 1807 | integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= 1808 | 1809 | queue-microtask@^1.2.2: 1810 | version "1.2.3" 1811 | resolved "https://registry.nlark.com/queue-microtask/download/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 1812 | integrity sha1-SSkii7xyTfrEPg77BYyve2z7YkM= 1813 | 1814 | randombytes@^2.1.0: 1815 | version "2.1.0" 1816 | resolved "https://registry.npm.taobao.org/randombytes/download/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 1817 | integrity sha1-32+ENy8CcNxlzfYpE0mrekc9Tyo= 1818 | dependencies: 1819 | safe-buffer "^5.1.0" 1820 | 1821 | range-parser@^1.2.1, range-parser@~1.2.1: 1822 | version "1.2.1" 1823 | resolved "https://registry.npm.taobao.org/range-parser/download/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 1824 | integrity sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE= 1825 | 1826 | raw-body@2.4.0: 1827 | version "2.4.0" 1828 | resolved "https://registry.nlark.com/raw-body/download/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" 1829 | integrity sha1-oc5vucm8NWylLoklarWQWeE9AzI= 1830 | dependencies: 1831 | bytes "3.1.0" 1832 | http-errors "1.7.2" 1833 | iconv-lite "0.4.24" 1834 | unpipe "1.0.0" 1835 | 1836 | readable-stream@^2.0.1: 1837 | version "2.3.7" 1838 | resolved "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" 1839 | integrity sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c= 1840 | dependencies: 1841 | core-util-is "~1.0.0" 1842 | inherits "~2.0.3" 1843 | isarray "~1.0.0" 1844 | process-nextick-args "~2.0.0" 1845 | safe-buffer "~5.1.1" 1846 | string_decoder "~1.1.1" 1847 | util-deprecate "~1.0.1" 1848 | 1849 | readable-stream@^3.0.6: 1850 | version "3.6.0" 1851 | resolved "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" 1852 | integrity sha1-M3u9o63AcGvT4CRCaihtS0sskZg= 1853 | dependencies: 1854 | inherits "^2.0.3" 1855 | string_decoder "^1.1.1" 1856 | util-deprecate "^1.0.1" 1857 | 1858 | readdirp@~3.6.0: 1859 | version "3.6.0" 1860 | resolved "https://registry.nlark.com/readdirp/download/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 1861 | integrity sha1-dKNwvYVxFuJFspzJc0DNQxoCpsc= 1862 | dependencies: 1863 | picomatch "^2.2.1" 1864 | 1865 | rechoir@^0.7.0: 1866 | version "0.7.1" 1867 | resolved "https://registry.nlark.com/rechoir/download/rechoir-0.7.1.tgz?cache=0&sync_timestamp=1627101702123&other_urls=https%3A%2F%2Fregistry.nlark.com%2Frechoir%2Fdownload%2Frechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" 1868 | integrity sha1-lHipahyhNbXoj8An8D7pLWxkVoY= 1869 | dependencies: 1870 | resolve "^1.9.0" 1871 | 1872 | regexp.prototype.flags@^1.2.0: 1873 | version "1.3.1" 1874 | resolved "https://registry.nlark.com/regexp.prototype.flags/download/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" 1875 | integrity sha1-fvNSro0VnnWMDq3Kb4/LTu8HviY= 1876 | dependencies: 1877 | call-bind "^1.0.2" 1878 | define-properties "^1.1.3" 1879 | 1880 | relateurl@^0.2.7: 1881 | version "0.2.7" 1882 | resolved "https://registry.nlark.com/relateurl/download/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" 1883 | integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= 1884 | 1885 | renderkid@^3.0.0: 1886 | version "3.0.0" 1887 | resolved "https://registry.npmmirror.com/renderkid/download/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" 1888 | integrity sha1-X9gj5NaVHTc1jsyaWLHwaDa2Joo= 1889 | dependencies: 1890 | css-select "^4.1.3" 1891 | dom-converter "^0.2.0" 1892 | htmlparser2 "^6.1.0" 1893 | lodash "^4.17.21" 1894 | strip-ansi "^6.0.1" 1895 | 1896 | requires-port@^1.0.0: 1897 | version "1.0.0" 1898 | resolved "https://registry.nlark.com/requires-port/download/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" 1899 | integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= 1900 | 1901 | resolve-cwd@^3.0.0: 1902 | version "3.0.0" 1903 | resolved "https://registry.nlark.com/resolve-cwd/download/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" 1904 | integrity sha1-DwB18bslRHZs9zumpuKt/ryxPy0= 1905 | dependencies: 1906 | resolve-from "^5.0.0" 1907 | 1908 | resolve-from@^5.0.0: 1909 | version "5.0.0" 1910 | resolved "https://registry.nlark.com/resolve-from/download/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" 1911 | integrity sha1-w1IlhD3493bfIcV1V7wIfp39/Gk= 1912 | 1913 | resolve@^1.9.0: 1914 | version "1.20.0" 1915 | resolved "https://registry.npm.taobao.org/resolve/download/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" 1916 | integrity sha1-YpoBP7P3B1XW8LeTXMHCxTeLGXU= 1917 | dependencies: 1918 | is-core-module "^2.2.0" 1919 | path-parse "^1.0.6" 1920 | 1921 | retry@^0.13.1: 1922 | version "0.13.1" 1923 | resolved "https://registry.nlark.com/retry/download/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" 1924 | integrity sha1-GFsVh6z2eRnWOzVzSeA1N7JIRlg= 1925 | 1926 | reusify@^1.0.4: 1927 | version "1.0.4" 1928 | resolved "https://registry.nlark.com/reusify/download/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 1929 | integrity sha1-kNo4Kx4SbvwCFG6QhFqI2xKSXXY= 1930 | 1931 | rimraf@^3.0.2: 1932 | version "3.0.2" 1933 | resolved "https://registry.npm.taobao.org/rimraf/download/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 1934 | integrity sha1-8aVAK6YiCtUswSgrrBrjqkn9Bho= 1935 | dependencies: 1936 | glob "^7.1.3" 1937 | 1938 | run-parallel@^1.1.9: 1939 | version "1.2.0" 1940 | resolved "https://registry.npm.taobao.org/run-parallel/download/run-parallel-1.2.0.tgz?cache=0&sync_timestamp=1612925943325&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frun-parallel%2Fdownload%2Frun-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 1941 | integrity sha1-ZtE2jae9+SHrnZW9GpIp5/IaQ+4= 1942 | dependencies: 1943 | queue-microtask "^1.2.2" 1944 | 1945 | safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1946 | version "5.1.2" 1947 | resolved "https://registry.nlark.com/safe-buffer/download/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1948 | integrity sha1-mR7GnSluAxN0fVm9/St0XDX4go0= 1949 | 1950 | safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: 1951 | version "5.2.1" 1952 | resolved "https://registry.nlark.com/safe-buffer/download/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1953 | integrity sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY= 1954 | 1955 | "safer-buffer@>= 2.1.2 < 3": 1956 | version "2.1.2" 1957 | resolved "https://registry.nlark.com/safer-buffer/download/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1958 | integrity sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo= 1959 | 1960 | schema-utils@^3.1.0, schema-utils@^3.1.1: 1961 | version "3.1.1" 1962 | resolved "https://registry.nlark.com/schema-utils/download/schema-utils-3.1.1.tgz?cache=0&sync_timestamp=1626694740261&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fschema-utils%2Fdownload%2Fschema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" 1963 | integrity sha1-vHTEtraZXB2I92qLd76nIZ4MgoE= 1964 | dependencies: 1965 | "@types/json-schema" "^7.0.8" 1966 | ajv "^6.12.5" 1967 | ajv-keywords "^3.5.2" 1968 | 1969 | select-hose@^2.0.0: 1970 | version "2.0.0" 1971 | resolved "https://registry.nlark.com/select-hose/download/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" 1972 | integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= 1973 | 1974 | selfsigned@^1.10.11: 1975 | version "1.10.11" 1976 | resolved "https://registry.nlark.com/selfsigned/download/selfsigned-1.10.11.tgz#24929cd906fe0f44b6d01fb23999a739537acbe9" 1977 | integrity sha1-JJKc2Qb+D0S20B+yOZmnOVN6y+k= 1978 | dependencies: 1979 | node-forge "^0.10.0" 1980 | 1981 | send@0.17.1: 1982 | version "0.17.1" 1983 | resolved "https://registry.nlark.com/send/download/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" 1984 | integrity sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg= 1985 | dependencies: 1986 | debug "2.6.9" 1987 | depd "~1.1.2" 1988 | destroy "~1.0.4" 1989 | encodeurl "~1.0.2" 1990 | escape-html "~1.0.3" 1991 | etag "~1.8.1" 1992 | fresh "0.5.2" 1993 | http-errors "~1.7.2" 1994 | mime "1.6.0" 1995 | ms "2.1.1" 1996 | on-finished "~2.3.0" 1997 | range-parser "~1.2.1" 1998 | statuses "~1.5.0" 1999 | 2000 | serialize-javascript@^6.0.0: 2001 | version "6.0.0" 2002 | resolved "https://registry.nlark.com/serialize-javascript/download/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" 2003 | integrity sha1-765diPRdeSQUHai1w6en5mP+/rg= 2004 | dependencies: 2005 | randombytes "^2.1.0" 2006 | 2007 | serve-index@^1.9.1: 2008 | version "1.9.1" 2009 | resolved "https://registry.nlark.com/serve-index/download/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" 2010 | integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= 2011 | dependencies: 2012 | accepts "~1.3.4" 2013 | batch "0.6.1" 2014 | debug "2.6.9" 2015 | escape-html "~1.0.3" 2016 | http-errors "~1.6.2" 2017 | mime-types "~2.1.17" 2018 | parseurl "~1.3.2" 2019 | 2020 | serve-static@1.14.1: 2021 | version "1.14.1" 2022 | resolved "https://registry.npm.taobao.org/serve-static/download/serve-static-1.14.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fserve-static%2Fdownload%2Fserve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" 2023 | integrity sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk= 2024 | dependencies: 2025 | encodeurl "~1.0.2" 2026 | escape-html "~1.0.3" 2027 | parseurl "~1.3.3" 2028 | send "0.17.1" 2029 | 2030 | setprototypeof@1.1.0: 2031 | version "1.1.0" 2032 | resolved "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" 2033 | integrity sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY= 2034 | 2035 | setprototypeof@1.1.1: 2036 | version "1.1.1" 2037 | resolved "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" 2038 | integrity sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM= 2039 | 2040 | shallow-clone@^3.0.0: 2041 | version "3.0.1" 2042 | resolved "https://registry.npm.taobao.org/shallow-clone/download/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" 2043 | integrity sha1-jymBrZJTH1UDWwH7IwdppA4C76M= 2044 | dependencies: 2045 | kind-of "^6.0.2" 2046 | 2047 | shebang-command@^2.0.0: 2048 | version "2.0.0" 2049 | resolved "https://registry.nlark.com/shebang-command/download/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 2050 | integrity sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo= 2051 | dependencies: 2052 | shebang-regex "^3.0.0" 2053 | 2054 | shebang-regex@^3.0.0: 2055 | version "3.0.0" 2056 | resolved "https://registry.nlark.com/shebang-regex/download/shebang-regex-3.0.0.tgz?cache=0&sync_timestamp=1628896299850&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fshebang-regex%2Fdownload%2Fshebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 2057 | integrity sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI= 2058 | 2059 | signal-exit@^3.0.3: 2060 | version "3.0.5" 2061 | resolved "https://registry.npmmirror.com/signal-exit/download/signal-exit-3.0.5.tgz?cache=0&sync_timestamp=1632948384106&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fsignal-exit%2Fdownload%2Fsignal-exit-3.0.5.tgz#9e3e8cc0c75a99472b44321033a7702e7738252f" 2062 | integrity sha1-nj6MwMdamUcrRDIQM6dwLnc4JS8= 2063 | 2064 | slash@^3.0.0: 2065 | version "3.0.0" 2066 | resolved "https://registry.nlark.com/slash/download/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 2067 | integrity sha1-ZTm+hwwWWtvVJAIg2+Nh8bxNRjQ= 2068 | 2069 | sockjs@^0.3.21: 2070 | version "0.3.21" 2071 | resolved "https://registry.nlark.com/sockjs/download/sockjs-0.3.21.tgz#b34ffb98e796930b60a0cfa11904d6a339a7d417" 2072 | integrity sha1-s0/7mOeWkwtgoM+hGQTWozmn1Bc= 2073 | dependencies: 2074 | faye-websocket "^0.11.3" 2075 | uuid "^3.4.0" 2076 | websocket-driver "^0.7.4" 2077 | 2078 | source-map-support@~0.5.20: 2079 | version "0.5.20" 2080 | resolved "https://registry.nlark.com/source-map-support/download/source-map-support-0.5.20.tgz?cache=0&sync_timestamp=1631179636992&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsource-map-support%2Fdownload%2Fsource-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9" 2081 | integrity sha1-EhZgifj15ejFaSazd2Mzkt0stsk= 2082 | dependencies: 2083 | buffer-from "^1.0.0" 2084 | source-map "^0.6.0" 2085 | 2086 | source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0: 2087 | version "0.6.1" 2088 | resolved "https://registry.nlark.com/source-map/download/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 2089 | integrity sha1-dHIq8y6WFOnCh6jQu95IteLxomM= 2090 | 2091 | source-map@~0.7.2: 2092 | version "0.7.3" 2093 | resolved "https://registry.nlark.com/source-map/download/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" 2094 | integrity sha1-UwL4FpAxc1ImVECS5kmB91F1A4M= 2095 | 2096 | spdy-transport@^3.0.0: 2097 | version "3.0.0" 2098 | resolved "https://registry.npm.taobao.org/spdy-transport/download/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" 2099 | integrity sha1-ANSGOmQArXXfkzYaFghgXl3NzzE= 2100 | dependencies: 2101 | debug "^4.1.0" 2102 | detect-node "^2.0.4" 2103 | hpack.js "^2.1.6" 2104 | obuf "^1.1.2" 2105 | readable-stream "^3.0.6" 2106 | wbuf "^1.7.3" 2107 | 2108 | spdy@^4.0.2: 2109 | version "4.0.2" 2110 | resolved "https://registry.npm.taobao.org/spdy/download/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" 2111 | integrity sha1-t09GYgOj7aRSwCSSuR+56EonZ3s= 2112 | dependencies: 2113 | debug "^4.1.0" 2114 | handle-thing "^2.0.0" 2115 | http-deceiver "^1.2.7" 2116 | select-hose "^2.0.0" 2117 | spdy-transport "^3.0.0" 2118 | 2119 | "statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: 2120 | version "1.5.0" 2121 | resolved "https://registry.npm.taobao.org/statuses/download/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 2122 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 2123 | 2124 | string_decoder@^1.1.1: 2125 | version "1.3.0" 2126 | resolved "https://registry.nlark.com/string_decoder/download/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" 2127 | integrity sha1-QvEUWUpGzxqOMLCoT1bHjD7awh4= 2128 | dependencies: 2129 | safe-buffer "~5.2.0" 2130 | 2131 | string_decoder@~1.1.1: 2132 | version "1.1.1" 2133 | resolved "https://registry.nlark.com/string_decoder/download/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 2134 | integrity sha1-nPFhG6YmhdcDCunkujQUnDrwP8g= 2135 | dependencies: 2136 | safe-buffer "~5.1.0" 2137 | 2138 | strip-ansi@^6.0.1: 2139 | version "6.0.1" 2140 | resolved "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 2141 | integrity sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk= 2142 | dependencies: 2143 | ansi-regex "^5.0.1" 2144 | 2145 | strip-ansi@^7.0.0: 2146 | version "7.0.1" 2147 | resolved "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" 2148 | integrity sha1-YXQKCM42th5Q5lZT8HBg0ACXX7I= 2149 | dependencies: 2150 | ansi-regex "^6.0.1" 2151 | 2152 | strip-final-newline@^2.0.0: 2153 | version "2.0.0" 2154 | resolved "https://registry.nlark.com/strip-final-newline/download/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" 2155 | integrity sha1-ibhS+y/L6Tb29LMYevsKEsGrWK0= 2156 | 2157 | supports-color@^8.0.0: 2158 | version "8.1.1" 2159 | resolved "https://registry.nlark.com/supports-color/download/supports-color-8.1.1.tgz?cache=0&sync_timestamp=1626703414084&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" 2160 | integrity sha1-zW/BfihQDP9WwbhsCn/UpUpzAFw= 2161 | dependencies: 2162 | has-flag "^4.0.0" 2163 | 2164 | tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: 2165 | version "2.2.1" 2166 | resolved "https://registry.nlark.com/tapable/download/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" 2167 | integrity sha1-GWenPvQGCoLxKrlq+G1S/bdu7KA= 2168 | 2169 | terser-webpack-plugin@^5.1.3: 2170 | version "5.2.4" 2171 | resolved "https://registry.nlark.com/terser-webpack-plugin/download/terser-webpack-plugin-5.2.4.tgz#ad1be7639b1cbe3ea49fab995cbe7224b31747a1" 2172 | integrity sha1-rRvnY5scvj6kn6uZXL5yJLMXR6E= 2173 | dependencies: 2174 | jest-worker "^27.0.6" 2175 | p-limit "^3.1.0" 2176 | schema-utils "^3.1.1" 2177 | serialize-javascript "^6.0.0" 2178 | source-map "^0.6.1" 2179 | terser "^5.7.2" 2180 | 2181 | terser@^5.7.2: 2182 | version "5.9.0" 2183 | resolved "https://registry.nlark.com/terser/download/terser-5.9.0.tgz?cache=0&sync_timestamp=1632229839325&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fterser%2Fdownload%2Fterser-5.9.0.tgz#47d6e629a522963240f2b55fcaa3c99083d2c351" 2184 | integrity sha1-R9bmKaUiljJA8rVfyqPJkIPSw1E= 2185 | dependencies: 2186 | commander "^2.20.0" 2187 | source-map "~0.7.2" 2188 | source-map-support "~0.5.20" 2189 | 2190 | thunky@^1.0.2: 2191 | version "1.1.0" 2192 | resolved "https://registry.nlark.com/thunky/download/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" 2193 | integrity sha1-Wrr3FKlAXbBQRzK7zNLO3Z75U30= 2194 | 2195 | to-regex-range@^5.0.1: 2196 | version "5.0.1" 2197 | resolved "https://registry.nlark.com/to-regex-range/download/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 2198 | integrity sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ= 2199 | dependencies: 2200 | is-number "^7.0.0" 2201 | 2202 | toidentifier@1.0.0: 2203 | version "1.0.0" 2204 | resolved "https://registry.nlark.com/toidentifier/download/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" 2205 | integrity sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM= 2206 | 2207 | tslib@^2.0.3: 2208 | version "2.3.1" 2209 | resolved "https://registry.nlark.com/tslib/download/tslib-2.3.1.tgz?cache=0&sync_timestamp=1628722556410&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" 2210 | integrity sha1-6KM1rdXOrlGqJh0ypJAVjvBC7wE= 2211 | 2212 | type-is@~1.6.17, type-is@~1.6.18: 2213 | version "1.6.18" 2214 | resolved "https://registry.nlark.com/type-is/download/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 2215 | integrity sha1-TlUs0F3wlGfcvE73Od6J8s83wTE= 2216 | dependencies: 2217 | media-typer "0.3.0" 2218 | mime-types "~2.1.24" 2219 | 2220 | unpipe@1.0.0, unpipe@~1.0.0: 2221 | version "1.0.0" 2222 | resolved "https://registry.nlark.com/unpipe/download/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 2223 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 2224 | 2225 | uri-js@^4.2.2: 2226 | version "4.4.1" 2227 | resolved "https://registry.npm.taobao.org/uri-js/download/uri-js-4.4.1.tgz?cache=0&sync_timestamp=1610237624359&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Furi-js%2Fdownload%2Furi-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 2228 | integrity sha1-mxpSWVIlhZ5V9mnZKPiMbFfyp34= 2229 | dependencies: 2230 | punycode "^2.1.0" 2231 | 2232 | url@^0.11.0: 2233 | version "0.11.0" 2234 | resolved "https://registry.nlark.com/url/download/url-0.11.0.tgz?cache=0&sync_timestamp=1618847135337&other_urls=https%3A%2F%2Fregistry.nlark.com%2Furl%2Fdownload%2Furl-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" 2235 | integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= 2236 | dependencies: 2237 | punycode "1.3.2" 2238 | querystring "0.2.0" 2239 | 2240 | user-agent@^1.0.4: 2241 | version "1.0.4" 2242 | resolved "https://registry.nlark.com/user-agent/download/user-agent-1.0.4.tgz#61201431fc7e84ea4a5e1e76392f163a1539c9a4" 2243 | integrity sha1-YSAUMfx+hOpKXh52OS8WOhU5yaQ= 2244 | 2245 | util-deprecate@^1.0.1, util-deprecate@~1.0.1: 2246 | version "1.0.2" 2247 | resolved "https://registry.nlark.com/util-deprecate/download/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 2248 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 2249 | 2250 | utila@~0.4: 2251 | version "0.4.0" 2252 | resolved "https://registry.nlark.com/utila/download/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" 2253 | integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= 2254 | 2255 | utils-merge@1.0.1: 2256 | version "1.0.1" 2257 | resolved "https://registry.nlark.com/utils-merge/download/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 2258 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= 2259 | 2260 | uuid@^3.4.0: 2261 | version "3.4.0" 2262 | resolved "https://registry.nlark.com/uuid/download/uuid-3.4.0.tgz?cache=0&sync_timestamp=1622213136953&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fuuid%2Fdownload%2Fuuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" 2263 | integrity sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4= 2264 | 2265 | vary@~1.1.2: 2266 | version "1.1.2" 2267 | resolved "https://registry.nlark.com/vary/download/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 2268 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 2269 | 2270 | watchpack@^2.2.0: 2271 | version "2.2.0" 2272 | resolved "https://registry.nlark.com/watchpack/download/watchpack-2.2.0.tgz#47d78f5415fe550ecd740f99fe2882323a58b1ce" 2273 | integrity sha1-R9ePVBX+VQ7NdA+Z/iiCMjpYsc4= 2274 | dependencies: 2275 | glob-to-regexp "^0.4.1" 2276 | graceful-fs "^4.1.2" 2277 | 2278 | wbuf@^1.1.0, wbuf@^1.7.3: 2279 | version "1.7.3" 2280 | resolved "https://registry.npm.taobao.org/wbuf/download/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" 2281 | integrity sha1-wdjRSTFtPqhShIiVy2oL/oh7h98= 2282 | dependencies: 2283 | minimalistic-assert "^1.0.0" 2284 | 2285 | webpack-cli@^4.9.1: 2286 | version "4.9.1" 2287 | resolved "https://registry.npmmirror.com/webpack-cli/download/webpack-cli-4.9.1.tgz?cache=0&sync_timestamp=1634556166566&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fwebpack-cli%2Fdownload%2Fwebpack-cli-4.9.1.tgz#b64be825e2d1b130f285c314caa3b1ba9a4632b3" 2288 | integrity sha1-tkvoJeLRsTDyhcMUyqOxuppGMrM= 2289 | dependencies: 2290 | "@discoveryjs/json-ext" "^0.5.0" 2291 | "@webpack-cli/configtest" "^1.1.0" 2292 | "@webpack-cli/info" "^1.4.0" 2293 | "@webpack-cli/serve" "^1.6.0" 2294 | colorette "^2.0.14" 2295 | commander "^7.0.0" 2296 | execa "^5.0.0" 2297 | fastest-levenshtein "^1.0.12" 2298 | import-local "^3.0.2" 2299 | interpret "^2.2.0" 2300 | rechoir "^0.7.0" 2301 | webpack-merge "^5.7.3" 2302 | 2303 | webpack-dev-middleware@^5.2.1: 2304 | version "5.2.1" 2305 | resolved "https://registry.npmmirror.com/webpack-dev-middleware/download/webpack-dev-middleware-5.2.1.tgz#97c948144349177856a3d2d9c612cc3fee180cf1" 2306 | integrity sha1-l8lIFENJF3hWo9LZxhLMP+4YDPE= 2307 | dependencies: 2308 | colorette "^2.0.10" 2309 | memfs "^3.2.2" 2310 | mime-types "^2.1.31" 2311 | range-parser "^1.2.1" 2312 | schema-utils "^3.1.0" 2313 | 2314 | webpack-dev-server@^4.4.0: 2315 | version "4.4.0" 2316 | resolved "https://registry.npmmirror.com/webpack-dev-server/download/webpack-dev-server-4.4.0.tgz#10ec17088f840c9ccb2ebb0b43c49ec293206f7e" 2317 | integrity sha1-EOwXCI+EDJzLLrsLQ8SewpMgb34= 2318 | dependencies: 2319 | ansi-html-community "^0.0.8" 2320 | bonjour "^3.5.0" 2321 | chokidar "^3.5.2" 2322 | colorette "^2.0.10" 2323 | compression "^1.7.4" 2324 | connect-history-api-fallback "^1.6.0" 2325 | del "^6.0.0" 2326 | express "^4.17.1" 2327 | graceful-fs "^4.2.6" 2328 | html-entities "^2.3.2" 2329 | http-proxy-middleware "^2.0.0" 2330 | internal-ip "^6.2.0" 2331 | ipaddr.js "^2.0.1" 2332 | open "^8.0.9" 2333 | p-retry "^4.5.0" 2334 | portfinder "^1.0.28" 2335 | schema-utils "^3.1.0" 2336 | selfsigned "^1.10.11" 2337 | serve-index "^1.9.1" 2338 | sockjs "^0.3.21" 2339 | spdy "^4.0.2" 2340 | strip-ansi "^7.0.0" 2341 | url "^0.11.0" 2342 | webpack-dev-middleware "^5.2.1" 2343 | ws "^8.1.0" 2344 | 2345 | webpack-merge@^5.7.3: 2346 | version "5.8.0" 2347 | resolved "https://registry.nlark.com/webpack-merge/download/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" 2348 | integrity sha1-Kznb8ir4d3atdEw5AiNzHTCmj2E= 2349 | dependencies: 2350 | clone-deep "^4.0.1" 2351 | wildcard "^2.0.0" 2352 | 2353 | webpack-sources@^3.2.0: 2354 | version "3.2.1" 2355 | resolved "https://registry.nlark.com/webpack-sources/download/webpack-sources-3.2.1.tgz#251a7d9720d75ada1469ca07dbb62f3641a05b6d" 2356 | integrity sha1-JRp9lyDXWtoUacoH27YvNkGgW20= 2357 | 2358 | webpack@^5.62.1: 2359 | version "5.62.1" 2360 | resolved "https://registry.npmmirror.com/webpack/download/webpack-5.62.1.tgz?cache=0&sync_timestamp=1636129625466&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fwebpack%2Fdownload%2Fwebpack-5.62.1.tgz#06f09b56a7b1bb13ed5137ad4b118358a90c9505" 2361 | integrity sha1-BvCbVqexuxPtUTetSxGDWKkMlQU= 2362 | dependencies: 2363 | "@types/eslint-scope" "^3.7.0" 2364 | "@types/estree" "^0.0.50" 2365 | "@webassemblyjs/ast" "1.11.1" 2366 | "@webassemblyjs/wasm-edit" "1.11.1" 2367 | "@webassemblyjs/wasm-parser" "1.11.1" 2368 | acorn "^8.4.1" 2369 | acorn-import-assertions "^1.7.6" 2370 | browserslist "^4.14.5" 2371 | chrome-trace-event "^1.0.2" 2372 | enhanced-resolve "^5.8.3" 2373 | es-module-lexer "^0.9.0" 2374 | eslint-scope "5.1.1" 2375 | events "^3.2.0" 2376 | glob-to-regexp "^0.4.1" 2377 | graceful-fs "^4.2.4" 2378 | json-parse-better-errors "^1.0.2" 2379 | loader-runner "^4.2.0" 2380 | mime-types "^2.1.27" 2381 | neo-async "^2.6.2" 2382 | schema-utils "^3.1.0" 2383 | tapable "^2.1.1" 2384 | terser-webpack-plugin "^5.1.3" 2385 | watchpack "^2.2.0" 2386 | webpack-sources "^3.2.0" 2387 | 2388 | websocket-driver@>=0.5.1, websocket-driver@^0.7.4: 2389 | version "0.7.4" 2390 | resolved "https://registry.nlark.com/websocket-driver/download/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" 2391 | integrity sha1-ia1Slbv2S0gKvLox5JU6ynBvV2A= 2392 | dependencies: 2393 | http-parser-js ">=0.5.1" 2394 | safe-buffer ">=5.1.0" 2395 | websocket-extensions ">=0.1.1" 2396 | 2397 | websocket-extensions@>=0.1.1: 2398 | version "0.1.4" 2399 | resolved "https://registry.npm.taobao.org/websocket-extensions/download/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" 2400 | integrity sha1-f4RzvIOd/YdgituV1+sHUhFXikI= 2401 | 2402 | which@^2.0.1: 2403 | version "2.0.2" 2404 | resolved "https://registry.nlark.com/which/download/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 2405 | integrity sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE= 2406 | dependencies: 2407 | isexe "^2.0.0" 2408 | 2409 | wildcard@^2.0.0: 2410 | version "2.0.0" 2411 | resolved "https://registry.npm.taobao.org/wildcard/download/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" 2412 | integrity sha1-p30g5SAMb6qsl55LOq3Hs91/j+w= 2413 | 2414 | wrappy@1: 2415 | version "1.0.2" 2416 | resolved "https://registry.nlark.com/wrappy/download/wrappy-1.0.2.tgz?cache=0&sync_timestamp=1619133505879&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwrappy%2Fdownload%2Fwrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2417 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 2418 | 2419 | ws@^8.1.0: 2420 | version "8.2.3" 2421 | resolved "https://registry.npmmirror.com/ws/download/ws-8.2.3.tgz?cache=0&sync_timestamp=1633200039582&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fws%2Fdownload%2Fws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba" 2422 | integrity sha1-Y6VkVtsbBDZ9C3IaC4DK5ti+y7o= 2423 | 2424 | yocto-queue@^0.1.0: 2425 | version "0.1.0" 2426 | resolved "https://registry.nlark.com/yocto-queue/download/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 2427 | integrity sha1-ApTrPe4FAo0x7hpfosVWpqrxChs= 2428 | --------------------------------------------------------------------------------