Best JavaScript code snippet using playwright-internal
runtime-dom.global.js
Source: runtime-dom.global.js
...4557 // But we have to place it in core due to tight coupling with core - splitting4558 // it out creates a ton of unnecessary complexity.4559 // Hydration also depends on some renderer internal logic which needs to be4560 // passed in via arguments.4561 function createHydrationFunctions(rendererInternals) {4562 const { mt: mountComponent, p: patch, o: { patchProp, nextSibling, parentNode, remove, insert, createComment } } = rendererInternals;4563 const hydrate = (vnode, container) => {4564 if ( !container.hasChildNodes()) {4565 warn(`Attempting to hydrate existing markup but container is empty. ` +4566 `Performing full mount instead.`);4567 patch(null, vnode, container);4568 return;4569 }4570 hasMismatch = false;4571 hydrateNode(container.firstChild, vnode, null, null);4572 flushPostFlushCbs();4573 if (hasMismatch && !false) {4574 // this error should show up in production4575 console.error(`Hydration completed but contains mismatches.`);
...
runtime-core.cjs.js
Source: runtime-core.cjs.js
...2289// But we have to place it in core due to tight coupling with core - splitting2290// it out creates a ton of unnecessary complexity.2291// Hydration also depends on some renderer internal logic which needs to be2292// passed in via arguments.2293function createHydrationFunctions(rendererInternals) {2294 const { mt: mountComponent, p: patch, o: { patchProp, nextSibling, parentNode, remove, insert, createComment } } = rendererInternals;2295 const hydrate = (vnode, container) => {2296 if ( !container.hasChildNodes()) {2297 warn(`Attempting to hydrate existing markup but container is empty. ` +2298 `Performing full mount instead.`);2299 patch(null, vnode, container);2300 return;2301 }2302 hasMismatch = false;2303 hydrateNode(container.firstChild, vnode, null, null);2304 flushPostFlushCbs();2305 if (hasMismatch && !false) {2306 // this error should show up in production2307 console.error(`Hydration completed but contains mismatches.`);
...
vendor.93f284d9.js
Source: vendor.93f284d9.js
...2309}2310let hasMismatch = false;2311const isSVGContainer = (container) => /svg/.test(container.namespaceURI) && container.tagName !== "foreignObject";2312const isComment = (node) => node.nodeType === 8;2313function createHydrationFunctions(rendererInternals) {2314 const {mt: mountComponent, p: patch, o: {patchProp: patchProp2, nextSibling, parentNode, remove: remove2, insert, createComment}} = rendererInternals;2315 const hydrate = (vnode, container) => {2316 hasMismatch = false;2317 hydrateNode(container.firstChild, vnode, null, null, null);2318 flushPostFlushCbs();2319 if (hasMismatch && true) {2320 console.error(`Hydration completed but contains mismatches.`);2321 }2322 };2323 const hydrateNode = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized = false) => {2324 const isFragmentStart = isComment(node) && node.data === "[";2325 const onMismatch = () => handleMismatch(node, vnode, parentComponent, parentSuspense, slotScopeIds, isFragmentStart);2326 const {type, ref: ref2, shapeFlag} = vnode;2327 const domType = node.nodeType;...
vendor.01f25a3a.js
Source: vendor.01f25a3a.js
...2262}2263let hasMismatch = false;2264const isSVGContainer = (container) => /svg/.test(container.namespaceURI) && container.tagName !== "foreignObject";2265const isComment = (node) => node.nodeType === 8;2266function createHydrationFunctions(rendererInternals) {2267 const {mt: mountComponent, p: patch, o: {patchProp: patchProp2, nextSibling, parentNode, remove: remove2, insert, createComment}} = rendererInternals;2268 const hydrate = (vnode, container) => {2269 hasMismatch = false;2270 hydrateNode(container.firstChild, vnode, null, null);2271 flushPostFlushCbs();2272 if (hasMismatch && true) {2273 console.error(`Hydration completed but contains mismatches.`);2274 }2275 };2276 const hydrateNode = (node, vnode, parentComponent, parentSuspense, optimized = false) => {2277 const isFragmentStart = isComment(node) && node.data === "[";2278 const onMismatch = () => handleMismatch(node, vnode, parentComponent, parentSuspense, isFragmentStart);2279 const {type, ref: ref2, shapeFlag} = vnode;2280 const domType = node.nodeType;...
vendor.6ab5482a.js
Source: vendor.6ab5482a.js
...2469}2470let hasMismatch = false;2471const isSVGContainer = (container) => /svg/.test(container.namespaceURI) && container.tagName !== "foreignObject";2472const isComment = (node) => node.nodeType === 8;2473function createHydrationFunctions(rendererInternals) {2474 const { mt: mountComponent, p: patch, o: { patchProp: patchProp2, nextSibling, parentNode, remove: remove2, insert, createComment } } = rendererInternals;2475 const hydrate = (vnode, container) => {2476 if (!container.hasChildNodes()) {2477 patch(null, vnode, container);2478 flushPostFlushCbs();2479 return;2480 }2481 hasMismatch = false;2482 hydrateNode(container.firstChild, vnode, null, null, null);2483 flushPostFlushCbs();2484 if (hasMismatch && true) {2485 console.error(`Hydration completed but contains mismatches.`);2486 }2487 };...
vendor.f4b2f46f.js
Source: vendor.f4b2f46f.js
...1969}1970let hasMismatch = false;1971const isSVGContainer = (container) => /svg/.test(container.namespaceURI) && container.tagName !== "foreignObject";1972const isComment = (node) => node.nodeType === 8;1973function createHydrationFunctions(rendererInternals) {1974 const {mt: mountComponent, p: patch, o: {patchProp: patchProp2, nextSibling, parentNode, remove: remove2, insert, createComment}} = rendererInternals;1975 const hydrate = (vnode, container) => {1976 hasMismatch = false;1977 hydrateNode(container.firstChild, vnode, null, null);1978 flushPostFlushCbs();1979 if (hasMismatch && true) {1980 console.error(`Hydration completed but contains mismatches.`);1981 }1982 };1983 const hydrateNode = (node, vnode, parentComponent, parentSuspense, optimized = false) => {1984 const isFragmentStart = isComment(node) && node.data === "[";1985 const onMismatch = () => handleMismatch(node, vnode, parentComponent, parentSuspense, isFragmentStart);1986 const {type, ref: ref2, shapeFlag} = vnode;1987 const domType = node.nodeType;...
runtime-core.cjs.prod.js
Source: runtime-core.cjs.prod.js
...1807// But we have to place it in core due to tight coupling with core - splitting1808// it out creates a ton of unnecessary complexity.1809// Hydration also depends on some renderer internal logic which needs to be1810// passed in via arguments.1811function createHydrationFunctions(rendererInternals) {1812 const { mt: mountComponent, p: patch, o: { patchProp, nextSibling, parentNode, remove, insert, createComment } } = rendererInternals;1813 const hydrate = (vnode, container) => {1814 hasMismatch = false;1815 hydrateNode(container.firstChild, vnode, null, null);1816 flushPostFlushCbs();1817 if (hasMismatch && !false) {1818 // this error should show up in production1819 console.error(`Hydration completed but contains mismatches.`);1820 }1821 };1822 const hydrateNode = (node, vnode, parentComponent, parentSuspense, optimized = false) => {1823 const isFragmentStart = isComment(node) && node.data === '[';1824 const onMismatch = () => handleMismtach(node, vnode, parentComponent, parentSuspense, isFragmentStart);1825 const { type, shapeFlag } = vnode;
...
summary.js
Source: summary.js
1*************2| interview |3*************4******************************************************************************5 htmlãcssç个人è§è§£6 ä¸ç代ç å
ç页é¢çè¯ cssæ æ³åºåæ°´å¹³é«ä½7 åæ ·çææå¯ä»¥ç¨å¾å¤æ¹å¼å®ç°åºæ¥ï¼8 æä¹ç¨æå°ç代ç å®ç° å°±ä½ç°äºä¸ªäººæ°´å¹³9 å
åå©ç¨ ç»§æ¿ãé»è®¤å±æ§ã伪å
ç´ 10 js11 æå¿«çåæ³è¦æ ¹æ®ä½¿ç¨åºæ¯æ¥å®12 vueçæºç æ ¹æ®ååç»å®çæºç å¯ä»¥ç¥éå¯ä»¥éè¿å»ç»å¯¹è±¡ä¼å大对象渲æé¡µé¢ï¼ åææ¯ä¸éè¦ååç»å®13******************************************************************************14 è¶³å¤çä¹å15 è·ä»»ä½äººèè° æé误 è½å®ä½å°å
¶ä»äººçé误åå ä¸ä»
æ¯èªå·±ç¥è¯èå´å
ç16 头èçµæ´»17 ä¸ä¸ªä»»å¡æ¥äº 该让è°ç®¡çé¡¹ç® è°åä¸ ä¸è½ä¹±å æ¯å¦ä¸ç»é¡¹ç®ç»ç管çæéããã18******************************************************************************19 大å端 FULL-STACK DEVELOPMENT å
¨æ å¼å20 1.çè®ºä¸ fe be db21 2.çæ£è½å¤æ¯æä¸å¡çfull-stackæ¶æï¼è³å°å为åå±ã22 第ä¸å±ï¼æ¯æ ¸å¿ä¸å¡é»è¾ï¼åãå端åè½ãAPIãæ°æ®23 第äºå±ï¼æ¯ä¸å¡æ¶æï¼å
·ä½å
æ¬åºç¨æ¡æ¶ãææ¯æ¶æãæ°æ®åºç24 第ä¸å±ï¼æ¯ä¸å¡è¿ç»´ï¼å
æ¬æ¥å¿ãçæ§åè¦ãæ©å±æ§ãè´è½½åè¡¡ç25 第åå±ï¼æ¯åºå±æ¶æï¼å
æ¬è®¡ç®èµæºãç³»ç»åç½ç»å®å
¨ãç¾å¤ç26******************************************************************************27 javascript28 1ãScope ä½ç¨å29 å¨jsä¸å¯ä»¥ç解为ç¨åºæ§è¡çå½åç¯å¢ï¼å称为ä¸ä¸æã The current context of execution.30 ä½ç¨åæå±çº§çæ¦å¿µï¼åä½ç¨åå¯ä»¥è®¿é®ç¶ä½ç¨åï¼åä¹åä¸è¡ã Scopes can also be layered in a hierarchy31 2ãclosure éå
32 彿°å彿°å¯¹å
¶å¨å´ç¶æ (the lexical environment è¯æ³ç¯å¢) çå¼ç¨ (åéãå彿°ç彿°å
ç代ç å) 就称为éå
.33 彿°å建æ¶å°±å建äºéå
ã34 éå
使æ¨å¯ä»¥ä»å
é¨å½æ°è®¿é®å¤é¨å½æ°çä½ç¨åã35 è¯æ³ï¼lexicalï¼ä¸è¯æçæ¯ï¼è¯æ³ä½ç¨åæ ¹æ®æºä»£ç ä¸å£°æåéçä½ç½®æ¥ç¡®å®è¯¥åéå¨ä½å¤å¯ç¨ã36 * éå
ç主è¦è¡¨ç° å°±æ¯å
é¨å½æ°ç»´æäºä¸ä¸ªå¯¹å®çè¯æ³ç¯å¢ï¼å¤é¨å½æ°çæä¸ªåéï¼çå¼ç¨ã37 * è¿ä¸ªä¾åä¸çname æ¯æ¬¡è°ç¨ myFunc é½ä¼ç´¯å 䏿¬¡38 * function makeFunc() {39 * var name = 10;40 * function displayName() {41 * console.log(name++);42 * }43 * displayName()44 * return displayName;45 * }46 *47 * var myFunc = makeFunc();48 * myFunc(); // 1049 * myFunc(); // 1150 * ...51 ******************************************************************************52 function makeAdder(x) {53 return function(y) {54 return x + y;55 };56 }57 var add5 = makeAdder(5);58 var add10 = makeAdder(10);59 console.log(add5(2)); // 760 console.log(add10(2)); // 1261 仿¬è´¨ä¸è®²ï¼makeAdder æ¯ä¸ä¸ªå½æ°å·¥å â ä»å建äºå°æå®çå¼åå®çåæ°ç¸å æ±åç彿°ã62 add5 å add10 齿¯éå
ãå®ä»¬å
±äº«ç¸åç彿°å®ä¹ï¼ä½æ¯ä¿åäºä¸åçè¯æ³ç¯å¢ãå¨ add5 ç63 ç¯å¢ä¸ï¼x 为 5ãèå¨add10 ä¸ï¼x å为 10ã64 ******************************************************************************65 å®ç°é¢å对象66 function makeSizer(size) {67 return function() {68 document.body.style.fontSize = size + 'px';69 };70 }71 var size12 = makeSizer(12);72 var size14 = makeSizer(14);73 ******************************************************************************74 模æç§ææ¹æ³ï¼ç§ææ¹æ³ä¸ä»
ä»
æå©äºéå¶å¯¹ä»£ç ç访é®ï¼è¿æä¾äºç®¡çå
¨å±å½å空é´ç强大è½75 åï¼é¿å
éæ ¸å¿çæ¹æ³å¼ä¹±äºä»£ç çå
Œ
±æ¥å£é¨åã76 è¿æ ·ä½¿ç¨éå
å¯ä»¥æäº¤è®¸å¤ä¸é¢å对象ç¼ç¨ç¸å
³çå¥½å¤ (ç¹å«æ¯æ°æ®éèåå°è£
.)77 var Counter = (function() {78 var privateCounter = 0;79 function changeBy(val) {80 privateCounter += val;81 }82 return {83 increment: function() {84 changeBy(1);85 },86 decrement: function() {87 changeBy(-1);88 },89 value: function() {90 return privateCounter;91 }92 }93 })();94 // privateCounter ç¸å½äºç§æåé95 // changeBy ç¸å½äºç§ææ¹æ³96 console.log(Counter.value()); /* 0 */97 Counter.increment();98 Counter.increment();99 console.log(Counter.value()); /* 2 */100 Counter.decrement();101 console.log(Counter.value()); /* 1 */102 ******************************************************************************103 3ãäºä»¶å¾ªç¯104 JSçä»£ç æ§è¡æ¯åºäºä¸ç§äºä»¶å¾ªç¯çæºå¶ï¼æä»¥ç§°ä½äºä»¶å¾ªç¯ã105 ç¨åºè¿è¡æ¶ï¼åæ¥ä»»å¡è¿å
¥ä¸»çº¿ç¨ï¼å³ä¸»æ§è¡æ ï¼å¼æ¥ä»»å¡è¿å
¥ä»»å¡éåã主线ç¨å
çä»»å¡(å®ä»»å¡) æ§è¡å®æ¯ (æ¯ä¸ªå®ä»»å¡ç»æå,106 é½è¦æ¸
空ææç微任å¡)ï¼ä¼å»ä»»å¡éå读åå
¶ä¸çä»»å¡ï¼æ¨å
¥ä¸»çº¿ç¨æ§è¡ï¼ä¸è¿°è¿ç¨ä¸æéå¤å°±æ¯æä»¬è¯´ç EventLoop (äºä»¶å¾ª107 ç¯) æ¯ä¸æ¬¡å¾ªç¯æä½ç§°ä¸ºä¸æ¬¡tick.108 **************************************************************************************************109 macro task å®ä»»å¡ï¼110 script( æ´ä½ä»£ç )ãsetTimeoutãsetIntervalãI/OãUI 交äºäºä»¶ãsetImmediate(Node.js ç¯å¢)ã postMessage111 * node.jséé¢setTimeout(fn, 0)ä¼è¢«å¼ºå¶æ¹ä¸ºsetTimeout(fn, 1) *112 * HTML5 éé¢setTimeoutæå°çæ¶é´éå¶æ¯4ms *113 micro task 微任å¡ï¼114 Promiseã MutaionObserverã process.nextTick(Node.js ç¯å¢)ã Object.observe115 * nodeç¯å¢ä¸(ä¾èµlibuv弿) process.nextTickä¼ä¼å
å
¶ä»å¾®ä»»å¡å
æ§è¡ *116 * MutaionObserverä¸äºä»¶ææ¬è´¨çä¸åï¼117 * äºä»¶æ¯åæ¥è§¦åï¼ä¹å°±æ¯è¯´DOMåçåå¨ç«å»ä¼è§¦åç¸åºçäºä»¶ï¼118 * MutaionObserveræ¯å¼æ¥è§¦åï¼DOMåçåå¨ä»¥åï¼å¹¶ä¸ä¼é©¬ä¸è§¦åï¼èæ¯è¦çå°å½åææDOMæä½é½ç»æåæè§¦åã119 * ä¼è´¨æç« ï¼ https://juejin.cn/post/6844904100195205133120 **************************************************************************************************121 1ãæå¥½çjs循ç¯å¨ç»åæ³122 function render (argument) {123 å¨ç»å¤ç代ç 124 }125 (function animloop() {126 render();127 window.requestAnimationFrame(animloop);128 })();129 2ãMutation Observer æ¯å¨DOM4ä¸å®ä¹çï¼ç¨äºæ¿ä»£ mutation events çæ°APIï¼å®çä¸åäºeventsçæ¯ï¼ææ130 ç嬿ä½ä»¥åç¸åºå¤ç齿¯å¨å
¶ä»èæ¬æ§è¡å®æä¹å弿¥æ§è¡çï¼å¹¶ä¸æ¯ææåå¨è§¦åä¹åï¼å°åå¨è®°å½å¨æ°ç»ä¸ï¼131 ç»ä¸è¿è¡åè°çï¼ä¹å°±æ¯è¯´ï¼å½ä½ 使ç¨observerçå¬å¤ä¸ªDOMååæ¶ï¼å¹¶ä¸è¿è¥å¹²ä¸ªDOMåçäºååï¼é£ä¹observer132 ä¼å°ååè®°å½å°ååæ°ç»ä¸ï¼çå¾
ææååé½ç»æäºï¼ä¸æ¬¡æ§çä»ååæ°ç»ä¸æ§è¡å
¶å¯¹åºçåè°å½æ°ã133 * Mutation events æ¯å¨ DOM3ä¸å®ä¹ï¼ç¨äºçå¬DOMæ ç»æååçäºä»¶134 *135 * 1ãæµè§å¨å
¼å®¹æ§é®é¢136 * IE9䏿¯æMutation Events; Webkitå
æ ¸ä¸æ¯æDOMAttrModifiedç¹æ§;137 * DOMElementNameChangedåDOMAttributeNameChanged å¨Firefoxä¸ä¸è¢«æ¯æã138 * 2ãæ§è½é®é¢139 * a.Mutation Eventsæ¯åæ¥æ§è¡çï¼å®çæ¯æ¬¡è°ç¨ï¼é½éè¦ä»äºä»¶éåä¸ååºäºä»¶ï¼æ§è¡ï¼ç¶åäºä»¶é140 * åä¸ç§»é¤ï¼æé´éè¦ç§»å¨éåå
ç´ ã妿äºä»¶è§¦åçè¾ä¸ºé¢ç¹çè¯ï¼æ¯ä¸æ¬¡é½éè¦æ§è¡ä¸é¢çè¿äºæ¥éª¤ï¼141 * é£ä¹æµè§å¨ä¼è¢«ææ
¢ã142 * b.Mutation Eventsæ¬èº«æ¯äºä»¶ï¼æä»¥æè·æ¯éç¨çæ¯äºä»¶å泡çå½¢å¼ï¼å¦æå泡æè·æé´å触åäºå
¶143 * ä»çMutationEventsçè¯ï¼å¾æå¯è½å°±ä¼å¯¼è´é»å¡Javascript线ç¨ï¼çè³å¯¼è´æµè§å¨å´©æºã144 ************************************************************************************************145 æµè§å¨åNodejsçEvent Loopï¼146 * JSæè°çâå线ç¨âåªæ¯æä¸»çº¿ç¨åªæä¸ä¸ªï¼å¹¶ä¸æ¯æ´ä¸ªè¿è¡ç¯å¢é½æ¯å线ç¨147 * JSç弿¥é åºå±çå¤çº¿ç¨å®ç°148 * ä¸åç弿¥API对åºä¸åçå®ç°çº¿ç¨149 * 弿¥çº¿ç¨ä¸ä¸»çº¿ç¨é讯é çæ¯Event Loop150 * 弿¥çº¿ç¨å®æä»»å¡åå°å
¶æ¾å
¥ä»»å¡éå151 * 主线ç¨ä¸æè½®è¯¢ä»»å¡éåï¼æ¿åºä»»å¡æ§è¡152 * ä»»å¡éåæå®ä»»å¡éåå微任å¡éåçåºå«153 * 微任å¡éåçä¼å
级æ´é«ï¼ææå¾®ä»»å¡å¤çå®åæä¼å¤çå®ä»»å¡154 * Promiseæ¯å¾®ä»»å¡155 * NodejsçEvent Loopè·æµè§å¨çEvent Loopä¸ä¸æ ·ï¼ä»æ¯åé¶æ®µç156 * setImmediateåsetTimeout(fn, 0)åªä¸ªåè°å
æ§è¡ï¼éè¦çä»ä»¬æ¬èº«å¨åªä¸ªé¶æ®µæ³¨åçï¼å¦æå¨å®æ¶å¨åè°æ157 è
I/Oåè°éé¢ï¼setImmediateè¯å®å
æ§è¡ã妿卿å¤å±æè
setImmediateåè°éé¢ï¼åªä¸ªå
æ§è¡åå³äºå½æ¶æºå¨ç¶åµã158 * process.nextTickä¸å¨Event Loopçä»»ä½é¶æ®µï¼ä»æ¯ä¸ä¸ªç¹æ®APIï¼ä»ä¼ä¼äºå
¶ä»å¾®ä»»å¡æ§è¡159 ************************************************************************************************160 NodejsçEvent Loopåé¶æ®µ161 * timers: æ§è¡setTimeoutåsetIntervalçåè°162 * pending callbacks: æ§è¡å»¶è¿å°ä¸ä¸ä¸ªå¾ªç¯è¿ä»£ç I/O åè°163 * idle, prepare: ä»
ç³»ç»å
é¨ä½¿ç¨164 * poll: æ£ç´¢æ°ç I/O äºä»¶;æ§è¡ä¸ I/O ç¸å
³çåè°ãäºå®ä¸é¤äºå
¶ä»å ä¸ªé¶æ®µå¤ççäºæ
ï¼å
¶ä»å 乿æç弿¥é½å¨165 è¿ä¸ªé¶æ®µå¤çã166 * check: setImmediate å¨è¿éæ§è¡167 * close callbacks: ä¸äºå
³éçåè°å½æ°ï¼å¦ï¼socket.on('close', ...)168********************************************************************************************************169 DOM level å DOMäºä»¶ * DOM 4 å·²åå¸ *170 1ãW3C DOMæ åï¼DOMå级ï¼å
åæä¸ä¸ªçæ¬ æ å: 1 2 3 (个人æè§levelè¯ä½æ å æ´åé)171 2ãDOMæ 忣å¼å½¢æåï¼æä¸äºè¢«å¹¿æ³åºç¨çè§åï¼è¿å°±æ¯æä»¬é常æè¯´çDOM level 0172 1ãDOMäºä»¶æ¨¡åæä¸ä¸ªï¼DOM level 0 å®ä¹çåå§äºä»¶æ¨¡åãDOM level 2 å®ä¹çäºä»¶æ¨¡åãIEäºä»¶æ¨¡å173 **************************************************************************************************174 åå§äºä»¶æ¨¡å ï¼ææäºåºè¯¥å¦ä½ä¸ºå
ç´ æ·»å äºä»¶çå¬ã å¨è¯¥æ¨¡åä¸ï¼äºä»¶ä¸ä¼ä¼ æï¼å³æ²¡æäºä»¶æµãåæ¶ï¼ç¨äº175 ä»¶çè¿å弿¥è¡¨ç¤ºæ¯å¦é»æ¢æµè§å¨é»è®¤è¡ä¸ºï¼è¿åå¼ä¸ºfalseæ¶ï¼é»æ¢é»è®¤è¡ä¸ºï¼å¦a龿¥ç跳转ï¼ã176 **************************************************************************************************177 DOM level 2 çäºä»¶æ¨¡åä¸ï¼å®ä¹äºæ·»å ãç§»é¤äºä»¶çå¬çæ¹å¼ï¼è¿å¢æ·»äºäºä»¶æµã178 addEventListener('click', fn, false)179 removeEventListener('click', fn, false)180 äºä»¶æµï¼äºä»¶ä¼ æï¼å为ä¸ä¸ªé¶æ®µï¼181 äºä»¶æè·é¶æ®µ: å
ç±ææ¡£çæ ¹èç¹documentå¾äºä»¶è§¦å对象ï¼ä»å¤åå
æè·äºä»¶å¯¹è±¡182 ç®æ é¶æ®µ: å°è¾¾ç®æ äºä»¶ä½ç½®ï¼è§¦åäºä»¶æ¬èº«çç¨åºå
容183 äºä»¶åæ³¡é¶æ®µ: åä»ç®æ äºä»¶ä½ç½®å¾ææ¡£çæ ¹èç¹æ¹ååæº¯ï¼ä»å
åå¤å泡äºä»¶å¯¹è±¡184 **************************************************************************************************185 IEäºä»¶æ¨¡å åªæç®æ é¶æ®µååæ³¡é¶æ®µ186 **************************************************************************************************187 2ãlevel 1 没æå®ä¹äºä»¶ç¸å
³çå
容ï¼ä»
ä»
æ¯å®ä¹äºHTMLåXMLææ¡£çåºå±ç»æï¼level 3 ä¹ä»
ä»
å®ä¹äºä¸äºDOMç¸å
³çæä½ã188 æä»¥è¿ä¸¤ä¸ªçæ¬çDOMæ åå¹¶ä¸åå¨äºä»¶æ¨¡åã189**********************************************************************************************************190 å®å
¨å»ç»ä¸ä¸ªå¯¹è±¡191 1ãconst obj 声æè¿ä¸ªå¯¹è±¡192 2ãObject.freeze(obj) éå Object.getOwnPropertyNames(obj)æ·±å»ç»193 3ãObject.create(null) æè
å»ç»ååé¾çæ°æ®(æ¯è¾å¤æ)194 å
¶ä»ç¥è¯ï¼195 1ãå©ç¨Object.freeze()æåæ§è½196 å½ä½ æä¸ä¸ªæ®éç JavaScript å¯¹è±¡ä¼ ç» Vue å®ä¾ç data é项ï¼Vue å°éåæ¤å¯¹è±¡ææç屿§ï¼å¹¶ä½¿ç¨197 Object.defineProperty æè¿äºå±æ§å
¨é¨è½¬ä¸º getter/setterï¼è¿äº getter/setter å¯¹ç¨æ·æ¥è¯´æ¯ä¸å¯è§çï¼198 使¯å¨å
é¨å®ä»¬è®© Vue 追踪ä¾èµï¼å¨å±æ§è¢«è®¿é®åä¿®æ¹æ¶éç¥ååã199 ä½ Vue å¨éå°å Object.freeze() è¿æ ·è¢«è®¾ç½®ä¸ºä¸å¯é
ç½®ä¹åçå¯¹è±¡å±æ§æ¶ï¼ä¸ä¼ä¸ºå¯¹è±¡å ä¸ setter getter200 çæ°æ®å«æçæ¹æ³ãåèVueæºç (vue伿£æµå¯¹è±¡é®çprop.configurable falseæ¶ ä¸è®¾ç½®ååç»å®)201 2ãéå®å¯¹è±¡çæ¹æ³202 Object.preventExtensions()203 no new properties or methods can be added to the project204 对象ä¸å¯æ©å±, å³ä¸å¯ä»¥æ°å¢å±æ§ææ¹æ³, ä½å¯ä»¥ä¿®æ¹/å é¤205 Object.seal()206 same as prevent extension, plus prevents existing properties and methods from being deleted207 å¨ä¸é¢çåºç¡ä¸ï¼å¯¹è±¡å±æ§ä¸å¯å é¤, ä½å¯ä»¥ä¿®æ¹208 Object.freeze()209 same as seal, plus prevent existing properties and methods from being modified210 å¨ä¸é¢çåºç¡ä¸ï¼å¯¹è±¡ææå±æ§åªè¯», ä¸å¯ä¿®æ¹211 以ä¸ä¸ä¸ªæ¹æ³åå«å¯ç¨Object.isExtensible(), Object.isSealed(), Object.isFrozen()æ¥æ£æµï¼é½å¯ä»¥è®¾ç½®212 configurable为falseã213 function getConfigurable (o, k) {214 var prop = Object.getOwnPropertyDescriptor(o, k)215 return prop && prop.configurable216 }217******************************************************************************218 对象ç屿§æè¿°ç¬¦219 1ãæ°æ®æè¿°ç¬¦ãæ°æ®æè¿°ç¬¦æ¯ä¸ä¸ªå
·æå¼ç屿§ï¼è¯¥å¼å¯ä»¥æ¯å¯åçï¼ä¹å¯ä»¥æ¯ä¸å¯åç220 Object.defineProperty(obj, "key", {221 enumerable: false,222 configurable: false,223 writable: false,224 value: "static"225 });226 2ãååæè¿°ç¬¦ãååæè¿°ç¬¦æ¯ç± getter 彿°å setter 彿°ææè¿°ç屿§ã227 **ä¸ä¸ªå¯¹è±¡å±æ§çæè¿°ç¬¦åªè½æ¯å
¶ä¸ä¹ä¸ï¼ä¸è½åæ¶æ¯ä¸¤è
ã**228 function withValue(value) {229 * é«æåæ³ï¼æå对象çèµå¼éåº¦ï¼æå¼åç´æ¥å¯»åï¼230 * æ å¼çæ¶åï¼å建对象æ¢è¦å¨æ å
ååæéï¼åè¦å¨å å
ååå¼231 var d = withValue.d || (232 withValue.d = {233 enumerable: false,234 writable: false,235 configurable: false,236 value: null237 }238 );239 d.value = value;240 return d;241 }242 | configurable | enumerable | value | writable | get | set243 ----------------------------------------------------------------------------244 æ°æ®æè¿°ç¬¦ | å¯ä»¥ | å¯ä»¥ | å¯ä»¥ | å¯ä»¥ | ä¸å¯ä»¥ | ä¸å¯ä»¥245 ----------------------------------------------------------------------------246 ååæè¿°ç¬¦ | å¯ä»¥ | å¯ä»¥ | ä¸å¯ä»¥ | ä¸å¯ä»¥ | å¯ä»¥ | å¯ä»¥247 使ç¨ç¹è¿ç®ç¬¦å Object.defineProperty() 为对象ç屿§èµå¼æ¶ï¼æ°æ®æè¿°ç¬¦ä¸ç屿§é»è®¤å¼æ¯ä¸åç248 1ão.a = 1;249 // çåäºï¼250 Object.defineProperty(o, "a", {251 value: 1,252 writable: true,253 configurable: true,254 enumerable: true255 });256 2ãObject.defineProperty(o, "a", { value : 1 });257 // çåäºï¼258 Object.defineProperty(o, "a", {259 value: 1,260 writable: false,261 configurable: false,262 enumerable: false263 });264******************************************************************************265 AST(Abstract Syntax Tree)æ½è±¡è¯æ³æ 266 ä¸ãå®ä¹267 ASTæ¯æºä»£ç çæ½è±¡è¯æ³ç»æçæ ç¶è¡¨ç¤ºï¼è¿ç§æ°æ®ç»æå
¶å®å°±æ¯ä¸ä¸ªå¤§çjson对象ãç®åçè§£ï¼å°±æ¯ææä»¬åçä»£ç æç
§ä¸268 å®çè§åè½¬æ¢æä¸ç§æ å½¢ç»æã269 äºãASTçç¨é270 ASTçä½ç¨ä¸ä»
ä»
æ¯ç¨æ¥å¨JavaScript弿çç¼è¯ä¸ï¼æä»¬å¨å®é
çå¼åè¿ç¨ä¸ä¹æ¯ç»å¸¸ä½¿ç¨çï¼æ¯å¦æä»¬å¸¸ç¨çbabelæä»¶å° ES6271 转åæES5ãä½¿ç¨ UglifyJSæ¥å缩代ç ãcssé¢å¤çå¨ãå¼åWebPackæä»¶ãVue-cliå端èªå¨åå·¥å
·ççï¼è¿äºåºå±åç齿¯åºäº272 ASTæ¥å®ç°çï¼ASTè½åååå¼ºå¤§ï¼ è½å¤å¸®å©å¼åè
çè§£JavaScriptè¿é¨è¯è¨çç²¾é«ã273******************************************************************************274 vueæºç 解读275 ä¸ã模æ¿å°çå®èç¹çè¿ç¨276 1ãæ§è¡ compile()ï¼ è°ç¨ parse() æ template è§£ææ AST(æ½è±¡è¯æ³æ );277 2ãoptimize() ä¼åéæèç¹ï¼æ è®°ä¸éè¦æ´æ°çå
容,diff ç®æ³ä¼ç´æ¥è·³è¿éæèç¹,ä»èåå°æ¯è¾çè¿ç¨,278 ä¼åäº patch çæ§è½ï¼279 3ãè°ç¨ generate() çæå¯æ§è¡çrender彿°;280 4ãrender彿°çæVnode对象;281 5ãæ ¹æ®Vnode对象çæçå®çDomèç¹ã282 äºãVueç»ä»¶å¤ç¨ä½¿ç¨V-slotï¼å
¶ä¸å
å«äºå¿åææ§½ãå
·åææ§½ãä½ç¨åææ§½283 é¦å
ï¼è¿è¡ initRender åå§å284 ç¶åï¼è¿è¡ renderSlot æè½½285 æåï¼è¿è¡ template ç¼è¯286 1ã// åå§åçå½å¨æãåå§åäºä»¶ãåå§årender彿°ç287 Vue.prototype._init = function(){288 ...289 vm._self = vm290 initLifecycle(vm)291 initEvents(vm)292 initRender(vm)293 callHook(vm, 'beforeCreate')294 initInjections(vm) // resolve injections before data/props295 initState(vm)296 initProvide(vm) // resolve provide after data/props297 callHook(vm, 'created')298 ...299 }300 åå§åï¼å¨initRenderä¸,$slotsä¸ $scopedSlots æè½½å°äºvdom ä¸ï¼å¹¶å¯¹slotä¸ç301 childrenè¿è¡éå,å¹¶ç»åæslots对象并è¿å resolveSlots()ã302 // initRender åå§å303 initRender (vm: Component) {304 ...305 vm.$slots = resolveSlots(options._renderChildren, renderContext)306 vm.$scopedSlots = emptyObject307 ...308 }309 // resolveSlots éåï¼å¹¶ç»åæ slots 对象并è¿å310 function resolveSlots (311 children: ?Array<VNode>,312 context: ?Component313 ): { [key: string]: Array<VNode> } {314 const slots = {}315 for (let i = 0, l = children.length; i < l; i++) {316 const child = children[i]317 ...318 if ((child.context === context || child.fnContext === context) &&319 data && data.slot != null320 ) {321 // å
·åææ§½322 const name = data.slot323 const slot = (slots[name] || (slots[name] = []))324 if (child.tag === 'template') {325 slot.push.apply(slot, child.children || [])326 } else {327 // å¿åææ§½328 slot.push(child)329 }330 } else {331 (slots.default || (slots.default = [])).push(child)332 }333 ...334 return slots335 }336 }337 **************************************************************************338 2ãæè½½ï¼éè¿æ¥éª¤1 çæäºslots 对象ï¼åç»è¿renderSlot彿°ï¼åå«å¤ç对象æå½æ°ï¼339 çænodesèç¹340 export function renderSlot (341 // åç»ä»¶ä¸slotçnameï¼å¿ådefault342 name: string,343 fallbackRender: ?((() => Array<VNode>) | Array<VNode>),344 props: ?Object,345 bindObject: ?Object346 ): ?Array<VNode> {347 ...348 const target = props && props.slot349 if (target) {350 return this.$createElement('template', { slot: target }, nodes)351 } else {352 return nodes353 }354 }355 3ã ç¼è¯ï¼å°nodes è¿è¡ç¼è¯å¹¶æ¸²æå°é¡µé¢356 ä¸ãVue é»è¾çå¤ç¨ mixin357 1ãminxinå
é¨çåå¹¶é»è¾åç¸å
³å½æ°çæ§è¡é¡ºåº358 å
¥å£å¨ 'global-api/index.js' initGlobalAPI -> initMixin -> mergeOptions -> strats359 1ãmergeOptions çé»è¾360 â ä¼å
å¤æææ²¡æmixiné颿mixinçæ
åµ æçè¯éå½è¿è¡åå¹¶ï¼æç»å½¢æä¸å±åµå¥å
³ç³»ã361 â¡ ä¼å
éå parent çkey, åéåchildä¸çkey362 ⢠è°ç¨å¯¹åºç strats[XXX]æ¹æ³è¿è¡åå¹¶363 strats[key]æ¯åå¹¶çæ ¸å¿é»è¾364 1ãdataä¸ è¥æ²¡æå¼åéæ°setï¼è¥åå¨åè¿è¡åå¹¶ï¼æç»è¿åå¤çåçæ°æ®å¯¹è±¡ã365 2ãçå½å¨ææ§è¡é»è¾æ¯ä¸æ ·ç, å°å½æ°åå
¥ä¸ä¸ªæ°çæ°ç»éåï¼å¹¶æ£åºéåï¼ä¾æ¬¡æ§è¡ã366 æ§è¡é¡ºåºä¸ºï¼å
¨å± mixin -> ç»ä»¶ mixinçmixin -> ç»ä»¶mixin -> ç»ä»¶ options367 3ãASSET_TYPESä¸å
æ¬componentãdirectiveãfilterï¼å®ä»¬éè¿ååé¾è¿è¡å å 368 4ãstrats.props = strats.methods = strats.inject = strats.computed ç´æ¥æ¿æ¢ã369 ******************************************************************************370 éç项ç®ç»æç夿ï¼å¼ç¨å¤§émixinä¼å¸¦æ¥ä¸äºä½¿ç¨ç¼ºé·ï¼æ¯å¦ï¼éå¼ä¾èµãå½åå²çªãä¾µå
¥å¼çé®é¢ã371 å æ¤ï¼å¨vue3ä¸åºç°äºä¸ä¸ªæ´å¥½çç»åå¼APIï¼ä½¿ç»ä»¶åé»è¾å¤ç¨æ´å æ¸
æ°ï¼å¯è¯»æ§æ´ä¼ã372 vue3 ä¸ vue2 çåºå«: æé 彿°ãååºå¼ä»¥åComposition Api373 1ãvue2ä¸éè¦ new Vue()æ¥åå»ºæ ¹å®ä¾å¹¶è¿è¡æ°æ®åæ¹æ³çåå§åï¼èvue3ä¸åç´æ¥ä½¿ç¨createAppæ¥374 å建对象ï¼å»æäºVue æé 彿°ï¼é¿å
éå¿
è¦åè½éæï¼åå°ä½ç§¯ã375 2ãVue3 ä½¿ç¨ Proxy代ç å代 Vue2ç Object.defineProperty嫿ï¼ä¸ååºå¼æ¨¡åæåºï¼å¯åç¬ä½¿376 ç¨ï¼å³reactivity377 3ãComposition Api 使å¾ç»ä»¶å æ´å å
èï¼å°é¶æ£åå¸çé»è¾ç»åå¨ä¸èµ·ï¼ä¹å¯ä»¥å°åç¬çåè½é»è¾æ378 åæåç¬çæä»¶ãå¨åæ³ä¸æ´è´´è¿äºreactççº¯å½æ°ææ³379 **************************************************************************380 Composition Apiéç¹å½æ°setupï¼setupæ¯ä½æ¶è¢«æ³¨åç381 // 1- åå§åï¼éè¿ ensureRendereræ¥ å建 app 对象382 const createApp = ((...args) => {383 const app = ensureRenderer().createApp(...args)384 }385 // 2 - ensureRenderer è°ç¨ createRenderer 渲æå½æ°386 function ensureRenderer() {387 return renderer || (renderer = createRenderer<Node, Element>(rendererOptions))388 }389 // 3- createRenderer è°ç¨ baseCreateRenderer390 function createRenderer(options: RendererOptions<HostNode, HostElement>) {391 return baseCreateRenderer<HostNode, HostElement>(options)392 }393 // 4- baseCreateRendererå¨è¿ä¸ªæ¹æ³ä¸å°vnodeè¿è¡diffåpatchæä½å¹¶æè½½å° container ä¸ï¼394 // æç»è¿å render hydrate createAppä¸ä¸ªå½æ°395 function baseCreateRenderer(396 options: RendererOptions,397 createHydrationFns?: typeof createHydrationFunctions398 ): any { ...399 return {400 render,401 hydrate,402 createApp: createAppAPI(render, hydrate)403 }404 ...405 // 5- `patch`ä¸åºç°äº processComponent 彿°ï¼ç»§èè°ç¨äº mountComponentï¼è¿å
¥äº406 // setupComponentä¸,å
è§£æå±æ§ï¼åè§£æslotsï¼ä¹åè°ç¨äºsetup彿°ã407 function setupComponent() {408 const propsOptions = Comp.props409 resolveProps(instance, initialVNode.props, propsOptions)410 resolveSlots(instance, initialVNode.children)411 setupStatefulComponent(instance, parentSuspense)412 }413 // 6- æç»çæ§è¡ç»æ handleSetupResultï¼å¦ææ¯å½æ°ï¼åèµå¼ç»å®ä¾å¯¹è±¡renderï¼å¦ææ¯å¯¹è±¡ï¼åå建ååºå¼ã414 export function handleSetupResult(415 instance: ComponentInternalInstance,416 setupResult: unknown,417 parentSuspense: SuspenseBoundary | null418 ) {419 if (isFunction(setupResult)) {420 instance.render = setupResult as RenderFunction421 } else if (isObject(setupResult)) {422 instance.renderContext = reactive(setupResult)423 }424 finishComponentSetup(instance, parentSuspense)425 }426 åãVue 2.0 çæ´æ°æºå¶(èædomãdiffç®æ³)427 èædomæ¯ç±ä¸ä¸ªä¸ªVnodeèç¹ç»æçï¼æ ¸å¿ä»£ç ä½äº patch.js, 大使µç¨ä¸ºï¼428 1ãæ°çVnodeèç¹ä¸åå¨å¹¶ä¸èçVnodeåå¨ï¼åªè°ç¨éæ¯Vnodeèç¹çHook; 妿èçVnodeèç¹ä¸åå¨ï¼429 åç´æ¥è°ç¨æ°å»ºå½æ°çæèç¹ã妿æ°èèç¹é½åå¨å¹¶ä¸éè¿sameVnode彿°å¤æä¸ºtrueï¼ååè¿è¡diffæä½ï¼430 å¦åä¹ç´æ¥å»æ°å»ºèç¹å¹¶æ¿æ¢ã431 *************************************************************************432 function sameVnode (a, b) {433 return (434 a.key === b.key && (435 (436 a.tag === b.tag &&437 a.isComment === b.isComment &&438 isDef(a.data) === isDef(b.data) &&439 sameInputType(a, b)440 ) || (441 isTrue(a.isAsyncPlaceholder) &&442 a.asyncFactory === b.asyncFactory &&443 isUndef(b.asyncFactory.error)444 )445 )446 )447 }448 sameVnode主è¦é»è¾:449 é¦å
夿keyæ¯å¦ä¸è´ï¼å
¶æ¬¡åæ¥ç»ä»¶éè¦å¤ææ¯å¦å为注éèç¹æé½ä¸æ¯æ³¨éèç¹ãæ°æ®ä¿¡æ¯æ¯å¦åå¨ãInputç±»åæ¯å¦ä¸è´ï¼450 è弿¥ç»ä»¶éè¦å¤æå·¥å彿°æ¯å¦ä¸è´ã451 2ãdiffçæ ¸å¿å¨updateChildren彿°452 äºãååç»å®çå®ç°åç453 1ãObject.defineProperty - get ï¼ç¨äº ä¾èµæ¶é454 2ãObject.defineProperty - setï¼ç¨äº ä¾èµæ´æ°455 3ãæ¯ä¸ª data 声æç屿§ï¼é½æ¥æä¸ä¸ªçä¸å±ä¾èµæ¶éå¨ subs (å
æ¬é¡µé¢çä¾èµãcomputeãwatchç)456 4ãä¾èµæ¶éå¨ subs ä¿åçä¾èµç watcher457 5ãwatcher ç¨äº è¿è¡è§å¾æ´æ°458 *****************************************************************************************************459 æ ¸å¿å®ç°ç±»:460 1ãObserver: å®çä½ç¨æ¯ç»å¯¹è±¡ç屿§æ·»å getter å setterï¼ç¨äºä¾èµæ¶éåæ´¾åæ´æ°461 2ãDep: ç¨äºæ¶éå½åååºå¼å¯¹è±¡çä¾èµå
³ç³»,æ¯ä¸ªååºå¼å¯¹è±¡å
æ¬åå¯¹è±¡é½æ¥æä¸ä¸ª Dep å®ä¾ï¼éé¢ç subs462 æ¯ Watcher å®ä¾æ°ç»ï¼,彿°æ®æåæ´æ¶,ä¼éè¿ dep.notify()éç¥å个 watcherã463 3ãWatcher: è§å¯è
对象 , å®ä¾å为渲æ watcher (render watcher), 计ç®å±æ§ watcher (computed464 watcher), 侦å¬å¨ watcherï¼user watcherï¼ä¸ç§ã465 *****************************************************************************************************466 å
ãv-model467 <input v-model="searchText"> ç¸å½äº468 <input v-bind:value="searchText" v-on:input="searchText = $event.target.value">469 *****************************************************************************************************470 èªå®ä¹ç»ä»¶ä¸ <custom-input v-bind:value="searchText" v-on:input="searchText = $event"></custom-input> /471 å
·ä½å®ç°472 Vue.component('custom-input', {473 props: ['value'],474 template: `475 <input476 v-bind:value="value"477 v-on:input="$emit('input', $event.target.value)"478 >479 `480 })481 ä½¿ç¨ <custom-input v-model="searchText"></custom-input> /482 ***************************************************************************************************483 **** éinputå
ç´ å°è£
çèªå®ä¹ç»ä»¶ ****484 ä¸ä¸ªç»ä»¶ä¸ç v-model é»è®¤ä¼å©ç¨å为 value ç prop åå为 input çäºä»¶ï¼ä½æ¯ååéæ¡ãå¤éæ¡çç±»åçè¾å
¥æ§ä»¶485 å¯è½ä¼å° value attribute ç¨äºä¸åçç®çãmodel é项å¯ä»¥ç¨æ¥é¿å
è¿æ ·çå²çªï¼486 Vue.component('base-checkbox', {487 model: {488 prop: 'checked',489 event: 'change'490 },491 props: {492 checked: Boolean493 },494 template: `495 <input496 type="checkbox"497 v-bind:checked="checked"498 v-on:change="$emit('change', $event.target.checked)"499 >500 `501 })502 ä½¿ç¨ <base-checkbox v-model="lovingVue"></base-checkbox> /503******************************************************************************504 vue 3.0 diffç®æ³è§£è¯»505 ä¸ãä»ä¹å°æ¹ç¨å°äºdiff506 1ãåå¨childrençvnode507 â element vnode å
ç´ ç±»åç508 ç¨ patchElement() å¤ç509 â¡ fragment vnode ç¢çç±»åç510 `<Fragment>511 <span> è¹æ </span>512 <span> é¦è </span>513 <span> 鏿¢¨ </span>514 </Fragment>`515 ç¨ processFragment() å¤ç516 2ãpatchChildren å¤ç 1 ä¸çvnode, patchChildrenæ¶ï¼åç°childrenè¿æèªå·±çchildrenï¼ä¼éå½åä¸patch517 æ ¹æ®æ¯å¦åå¨keyè¿è¡çæ£çdiff patchKeyedChildren() æè
ç´æ¥patch patchUnkeyedChildren()518 äºãdiffç®æ³519 å¨vue2 diffç®æ³çåºç¡ä¸ ä½¿ç¨ æé¿å¢é¿ååºåç®æ³ åäºä¼åï¼å¤§å¤§æé«äºæçã以䏿¯å®ç°æ¹æ³520 1ã卿è§å521 var arr = [2,3,5,10,7,20,100,0];522 let dp =[];523 for(let i=0;i<arr.length;i++){524 dp[i]=1;525 }526 let res = 0;527 for(let i=1;i<arr.length;i++){528 for(let j=0;j<i;j++){529 if(arr[j]<arr[i]){530 dp[i] = Math.max(dp[i],dp[j]+1) // dp[i]代表第i个ä½ç½®ä¸åååºåä¸å
ç´ çé¿åº¦531 }532 }533 res = Math.max(res,dp[i])534 }535 console.log(res)536 2ãæå°äºåæ³537 let arr = [1, 5, 6, 7, 8, 2, 3, 4, 9]538 let subArr = [0]539 let prevIndex=[0];540 for (let i = 1; i < arr.length; i++) {541 if (arr[i] > arr[subArr[subArr.length - 1]]) {542 prevIndex.push(subArr[subArr.length - 1])543 subArr.push(i)544 } else {// arr[i] è¾å°545 let u = 0;546 let c= 0;547 let v = subArr.length - 1548 // äºåæç´¢ï¼æ¥æ¾æ¯ arrI å°çèç¹ï¼æ´æ° result çå¼549 while (u < v) {550 c = ((u + v) / 2) | 0551 if (arr[i] > arr[subArr[c]]) {552 u = c + 1553 } else {554 v = c555 }556 }557 if (arr[i] < arr[subArr[u]]) {558 prevIndex.push(subArr[u-1])559 subArr[u] = i560 }561 }562 // å©ç¨å驱èç¹éæ°è®¡ç®subArr563 let length = subArr.length; //æ»é¿åº¦564 let prev = subArr[length - 1] // æåä¸é¡¹565 while (length-- > 0) {// æ ¹æ®å驱èç¹ä¸ä¸ªä¸ªå忥æ¾566 subArr[length] = prev567 prev = prevIndex[subArr[length]]568 }569 }570************************************************************************************************************571 /*572 * vue2 vue3 ååç»å®çåç573 *574 */575 var person = {};576 Object.defineProperties(person, {577 age: {578 defaultValue:11,579 get:function(){580 return this.defaultValue;581 },582 set:function(val){583 this.defaultValue=val;584 console.log("触åäºset");585 }586 }587 })588 //ä¿®æ¹å±æ§ç弿¶è½å¤è§¦åset589 person.age =12 //触åäºset590 person.age // 12591 //å°å±ä»¶çå¼è®¾ç½®ä¸ºä¸ä¸ªæ°ç»ï¼å½éè¿ç´¢å¼å¼ä¿®æ¹æ°ç»çæä¸é¡¹æä½¿ç¨æäºæ¹æ³ä¿®æ¹æ°ç»æ¶ä¸è½è§¦åæ¹æ³592 person.age =[2ï¼3ï¼4] // 触åäºset593 person.age[2]=5//æªè§¦åset594 person.age // [2ï¼3, 5] æ°æ®å·²ç»æ¹å595 person.age.push(5)//æªè§¦åset596 person.age // [2,3ï¼5ï¼5]597 //å°æ§çå¼è®¾ç½®ä¸ºä¸ä¸ªå¯¹è±¡ï¼å½ä¿®æ¹å¯¹è±¡ä¸æå±æ§ç弿¶æ æ³è§¦åset598 person.age = { first: 1 } // 触åäºset599 person.age.first = 2 //æªè§¦åset600 let obj = {};601 let handler = {602 get(target,property){603 console.log(`${property} 被读å`);604 return property in target ? target[property] :3:605 },606 set(target,property,value){607 console.log(`${property}被设置为 ${value}`);608 target[property]=value;609 return true610 }611 }612 let p = new Proxy(obj, handler);613 p.name="tom" //name 被设置为tom614 p.age;//age 被读å3615 let q = new Proxy([[1,2,3], 2],handler);616 q.length // length 被读å617 q[1] // 1被读å618 q[2] = 6 //2被设置为6619 q.push(4) //3被设置为4620 q // Proxy {0:1,1:2ï¼2:6ï¼3:4]621************************************************************************************************************622 é¢è¯é¢623 ä¸ãvm.$set()å®ç°åç624 1ãå¦æç®æ æ¯æ°ç»,ä½¿ç¨ vue å®ç°çå弿¹æ³ splice å®ç°ååºå¼625 2ãå¦æç®æ æ¯å¯¹è±¡,夿屿§åå¨,å³ä¸ºååºå¼,ç´æ¥èµå¼626 3ã妿 target æ¬èº«å°±ä¸æ¯ååºå¼,ç´æ¥èµå¼627 4ã妿屿§ä¸æ¯ååºå¼,åè°ç¨ defineReactive æ¹æ³è¿è¡ååºå¼å¤ç628 äºãkeep-alive çå®ç°åçåç¼åçç¥629 1ãè·å keep-alive å
裹çç第ä¸ä¸ªåç»ä»¶å¯¹è±¡åå
¶ç»ä»¶å630 2ãæ ¹æ®è®¾å®ç include/excludeï¼å¦ææï¼è¿è¡æ¡ä»¶å¹é
,å³å®æ¯å¦ç¼åãä¸å¹é
,ç´æ¥è¿åç»ä»¶å®ä¾631 3ãæ ¹æ®ç»ä»¶ ID å tag çæç¼å Key,å¹¶å¨ç¼åå¯¹è±¡ä¸æ¥æ¾æ¯å¦å·²ç¼åè¿è¯¥ç»ä»¶å®ä¾ã妿åå¨,ç´æ¥ååºç¼åå¼å¹¶æ´æ°è¯¥632 key å¨ this.keys ä¸çä½ç½®(æ´æ° key çä½ç½®æ¯å®ç° LRU ç½®æ¢çç¥çå
³é®)633 4ãå¨ this.cache 对象ä¸åå¨è¯¥ç»ä»¶å®ä¾å¹¶ä¿å key å¼,ä¹åæ£æ¥ç¼åçå®ä¾æ°éæ¯å¦è¶
è¿ max ç设置å¼,è¶
è¿åæ ¹æ®634 LRU ç½®æ¢çç¥å é¤æè¿æä¹
æªä½¿ç¨çå®ä¾ï¼å³æ¯ä¸æ 为 0 çé£ä¸ª keyï¼635 ä¸ãVue ç¶åç»ä»¶ççå½å¨æé¡ºåº636 1ãå 载渲æè¿ç¨637 ç¶beforeCreate->ç¶created->ç¶beforeMount->åbeforeCreate->åcreated->åbeforeMount->åmounted->ç¶mounted638 2ãåç»ä»¶æ´æ°è¿ç¨639 ãã ç¶beforeUpdate->åbeforeUpdate->åupdated->ç¶updated640 3ãç¶ç»ä»¶æ´æ°è¿ç¨641 ãã ç¶beforeUpdate->ç¶updated642 4ã鿝è¿ç¨643 ãã ç¶beforeDestroy->åbeforeDestroy->ådestroyed->ç¶destroyed644************************************************************************************************************645 /*646 * å端路ç±ç两ç§å®ç°åç647 */648 ä¸ãHash模å¼649 éç¹æ¯ hashchange äºä»¶650 äºãHistory 模å¼651 history.pushState() æ history.replaceState()652 è°ç¨ history.pushState() æ history.replaceState() æ¹æ³ä¸ä¼è§¦åpopstateäºä»¶ï¼åªæå¨ååºæµè§å¨å¨ä½æ¶ï¼æä¼è§¦653 å该äºä»¶ï¼å¦ç¨æ·ç¹å»æµè§å¨çåéæé®ï¼æè
å¨Javascript代ç ä¸è°ç¨ history.back() æè
history.forward()æ¹æ³ï¼...
Using AI Code Generation
1const { createHydrationFunctions } = require('@playwright/test');2const { chromium } = require('playwright');3(async () => {4 const browser = await chromium.launch();5 const context = await browser.newContext();6 const page = await context.newPage();7 const { hydrate } = createHydrationFunctions(page);8 await hydrate();9 await browser.close();10})();11const { createHydrationFunctions } = require('@playwright/test');12const { chromium } = require('playwright');13(async () => {14 const browser = await chromium.launch();15 const context = await browser.newContext();16 const page = await context.newPage();17 const { hydrate } = createHydrationFunctions(page);18 await hydrate({19 before: async (page, action) => {20 console.log(action);21 },22 });23 await browser.close();24})();25{ action: 'click', selector: 'text=Get Started' }26{ action: 'click', selector: 'text=Docs' }27{ action: 'click', selector: 'text=API' }28{ action: 'click', selector: 'text=Blog' }29{ action: 'click', selector: 'text=Community' }30{ action: 'click', selector: 'text=GitHub' }31{ action: 'click', selector: 'text=Twitter' }32{ action: 'click', selector: 'text=YouTube' }33{ action: 'click', selector: 'text=LinkedIn' }34{ action: 'click', selector: 'text=Slack' }35{ action: 'click', selector: 'text=Discord' }36{ action: 'click', selector: 'text=Stack Overflow' }37{
Using AI Code Generation
1const { createHydrationFunctions } = require('playwright/lib/server/frames');2const { Page } = require('playwright/lib/server/page');3const { Frame } = require('playwright/lib/server/frame');4const { ElementHandle } = require('playwright/lib/server/elementHandler');5const { JSHandle } = require('playwright/lib/server/jsHandle');6const { CDPSession } = require('playwright/lib/server/cdpsession');7const { helper } = require('playwright/lib/helper');8const { assert } = require('playwright/lib/helper');9const { debugError } = require('playwright/lib/helper');10const { debug } = require('playwright/lib/helper');11const { debugProtocol } = require('playwright/lib/helper');12const { createTestState, setupTestBrowserHooks, setupTestPageAndContextHooks, it, describe } = require('./mocha-utils');13const { itFixme } = require('./mocha-utils');14const { itFailsFirefox } = require('./mocha-utils');15const { itFailsChrome } = require('./mocha-utils');16const { itFailsWebKit } = require('./mocha-utils');17const { itFails } = require('./mocha-utils');18const { itFailsWindows } = require('./mocha-utils');19const { itFailsLinux } = require('./mocha-utils');20const { itFailsMac } = require('./mocha-utils');21const { itFailsAndroid } = require('./mocha-utils');22const { itFailsAndroidFirefox } = require('./mocha-utils');23const { itFailsAndroidWebKit } = require('./mocha-utils');24const { itFailsAndroidChrome } = require('./mocha-utils');25const { itFailsIos } = require('./mocha-utils');26const { itFailsIosWebKit } = require('./mocha-utils');27const { itFailsIosFirefox } = require('./mocha-utils');28const { itFailsIosChrome } = require('./mocha-utils');29const { itFailsIosSafari } = require('./mocha-utils');30const { itFailsIosSafari14 } = require('./mocha-utils');31const { itFailsIosSafari13 } = require('./mocha-utils');32const { itFailsIosSafari12 } = require('./mocha-utils');33const { itFailsIosSafari11 }
Using AI Code Generation
1const { createHydrationFunctions } = require('playwright/lib/internal/hydrate');2const { createHydrationFunctions } = require('playwright/lib/internal/hydrate');3const { createHydrationFunctions } = require('playwright/lib/internal/hydrate');4const { createHydrationFunctions } = require('playwright/lib/internal/hydrate');5const { createHydrationFunctions } = require('playwright/lib/internal/hydrate');6const { createHydrationFunctions } = require('playwright/lib/internal/hydrate');7const { createHydrationFunctions } = require('playwright/lib/internal/hydrate');8const { createHydrationFunctions } = require('playwright/lib/internal/hydrate');9const { createHydrationFunctions } = require('playwright/lib/internal/hydrate');10const { createHydrationFunctions } = require('playwright/lib/internal/hydrate');11const { createHydrationFunctions } = require('playwright/lib/internal/hydrate');12const { createHydrationFunctions } = require('playwright/lib/internal/hydrate');13const { createHydrationFunctions } = require('playwright/lib/internal/hydrate');14const { createHydrationFunctions } = require('playwright/lib/internal/hydrate');15const { createHydrationFunctions } = require('playwright/lib/internal/hydrate');
Using AI Code Generation
1const { createHydrationFunctions } = require('playwright/lib/server/dom.js');2const { jsdom } = require("jsdom");3const fs = require('fs');4const path = require('path');5const html = fs.readFileSync(path.join(__dirname, 'test.html'), 'utf8');6const document = jsdom(html).defaultView.document;7const { hydrate, dehydrate } = createHydrationFunctions(document);8const el = document.getElementById('test');9const dehydrated = dehydrate(el);10const hydrated = hydrate(dehydrated);11console.log(hydrated);
Using AI Code Generation
1const { createHydrationFunctions } = require('playwright/lib/server/dom.js');2const { JSDOM } = require('jsdom');3const { parse } = require('node-html-parser');4const fs = require('fs');5const html = fs.readFileSync('test.html', 'utf-8');6const dom = new JSDOM(html);7const { window } = dom;8const { document } = window;9const { hydrate } = createHydrationFunctions(window);10const html = fs.readFileSync('test.html', 'utf-8');11const root = parse(html);12hydrate(root);13 function test() {14 console.log('test() is called');15 }16 <button onclick="test()">Click me</button>
Using AI Code Generation
1const { createHydrationFunctions } = require('playwright/lib/internal/hydrate');2const { createPage } = require('playwright/lib/internal/page');3const { createBrowserContext } = require('playwright/lib/internal/browserContext');4const context = createBrowserContext();5const { page, frame } = createPage(context, 'about:blank', true);6const { hydrate, dehydrate } = createHydrationFunctions(page);7const { myElement } = hydrate(`8`);9const html = dehydrate(myElement);10console.log(html);11await context.close();12const pageSource = await page.evaluate(() => document.documentElement.outerHTML);13console.log(pageSource);14const pageSource = await page.content();15console.log(pageSource);16const pageSource = await page.evaluate(() => document.documentElement.outerHTML);17console.log(pageSource);18const pageSource = await page.content();19console.log(pageSource);20const pageSource = await page.evaluate(() =>
Using AI Code Generation
1const { createHydrationFunctions } = require('playwright/lib/server/supplements/hydrate');2const { createServer, request } = require('http');3const { parse } = require('url');4const { createReadStream } = require('fs');5const { hydrate, dehydrate } = createHydrationFunctions();6const server = createServer(async (req, res) => {7 const { pathname } = parse(req.url);8 if (pathname === '/test.html') {9 const html = await dehydrate(`<html>10 window.foo = 'bar';11 window.foo = 'baz';12 </html>`);13 res.end(html);14 } else if (pathname === '/test.js') {15 const js = await hydrate(`console.log(window.foo)`);16 res.end(js);17 } else {18 res.end('Not Found');19 }20});21server.listen(3000, () => {22 let data = '';23 res.on('data', (chunk) => data += chunk);24 res.on('end', () => {25 const dom = new JSDOM(data);26 const script = dom.window.document.createElement('script');27 dom.window.document.body.appendChild(script);28 script.addEventListener('load', () => {29 server.close();30 });31 });32 });33});
Using AI Code Generation
1const { createHydrationFunctions } = require('playwright/lib/server/frames');2const { Frame } = require('playwright/lib/server/frames');3const { Page } = require('playwright/lib/server/page');4const { ElementHandle } = require('playwright/lib/server/dom');5const { JSHandle } = require('playwright/lib/server/javascript');6const { serializeResult } = require('playwright/lib/server/serializers');7const { Protocol } = require('playwright/lib/protocol');8const { createPlaywright } = require('playwright');9const playwright = createPlaywright();10(async () => {11 const browser = await playwright.chromium.launch();12 const context = await browser.newContext();13 const page = await context.newPage();14 const frame = page.mainFrame();15 const elementHandle = await frame.$('form');16 const { hydrate, dehydrate } = createHydrationFunctions();17 const hydratedElementHandle = hydrate(elementHandle);18 const dehydratedElementHandle = dehydrate(hydratedElementHandle);19 console.log(dehydratedElementHandle);20 await browser.close();21})();22const { createHydrationFunctions } = require('playwright/lib/server/frames');23const { Frame } = require('playwright/lib/server/frames');24const { Page } = require('playwright/lib/server/page');25const { ElementHandle } = require('playwright/lib/server/dom');26const { JSHandle } = require('playwright/lib/server/javascript');27const { serializeResult } = require('playwright/lib/server/serializers');28const { Protocol } = require('playwright/lib/protocol');29const { createPlaywright } = require('playwright');30const playwright = createPlaywright();31(async () => {32 const browser = await playwright.chromium.launch();33 const context = await browser.newContext();34 const page = await context.newPage();35 const frame = page.mainFrame();36 const { hydrate, dehydrate } = createHydrationFunctions();37 const elementHandle = dehydrate({
Using AI Code Generation
1import { createHydrationFunctions } from 'playwright/lib/server/dom.js';2const { hydrate, dehydrate } = createHydrationFunctions();3const html = `<div id="div1">Hello World</div>`;4const element = hydrate(html);5console.log(element.innerHTML);6const dehydratedHTML = dehydrate(element);7console.log(dehydratedHTML);8import { createSnapshot } from 'playwright/lib/server/dom.js';9const snapshot = createSnapshot(document);10console.log(snapshot.innerHTML);11import { createSnapshot, restoreSnapshot } from 'playwright/lib/server/dom.js';12const snapshot = createSnapshot(document);13restoreSnapshot(document, snapshot);14- [playwright](
Running Playwright in Azure Function
How to run a list of test suites in a single file concurrently in jest?
firefox browser does not start in playwright
Is it possible to get the selector from a locator object in playwright?
firefox browser does not start in playwright
Jest + Playwright - Test callbacks of event-based DOM library
I played with your example for a while and I got the same errors. These are the things I found that made my example work:
It must be Linux. I know that you mentioned that you picked a Linux plan. But I found that in VS Code that part is hidden, and on the Web the default is Windows. This is important because only the Linux plan runs npm install
on the server.
Make sure that you are building on the server. You can find this option in the VS Code Settings:
Make sure you set the environment variable PLAYWRIGHT_BROWSERS_PATH
, before making the publish.
Check out the latest blogs from LambdaTest on this topic:
Unit and functional testing are the prime ways of verifying the JavaScript code quality. However, a host of tools are available that can also check code before or during its execution in order to test its quality and adherence to coding standards. With each tool having its unique features and advantages contributing to its testing capabilities, you can use the tool that best suits your need for performing JavaScript testing.
Sometimes, in our test code, we need to handle actions that apparently could not be done automatically. For example, some mouse actions such as context click, double click, drag and drop, mouse movements, and some special key down and key up actions. These specific actions could be crucial depending on the project context.
Let’s put it short: Appium Desktop = Appium Server + Inspector. When Appium Server runs automation test scripts, Appium Inspector can identify the UI elements of every application under test. The core structure of an Appium Inspector is to ensure that you discover every visible app element when you develop your test scripts. Before you kickstart your journey with Appium Inspector, you need to understand the details of it.
Traditional software testers must step up if they want to remain relevant in the Agile environment. Agile will most probably continue to be the leading form of the software development process in the coming years.
With the rising demand for new services and technologies in the IT, manufacturing, healthcare, and financial sector, QA/ DevOps engineering has become the most important part of software companies. Below is a list of some characteristics to look for when interviewing a potential candidate.
LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!