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](
Jest + Playwright - Test callbacks of event-based DOM library
firefox browser does not start in playwright
Is it possible to get the selector from a locator object in playwright?
How to run a list of test suites in a single file concurrently in jest?
Running Playwright in Azure Function
firefox browser does not start in playwright
This question is quite close to a "need more focus" question. But let's try to give it some focus:
Does Playwright has access to the cPicker object on the page? Does it has access to the window object?
Yes, you can access both cPicker and the window object inside an evaluate call.
Should I trigger the events from the HTML file itself, and in the callbacks, print in the DOM the result, in some dummy-element, and then infer from that dummy element text that the callbacks fired?
Exactly, or you can assign values to a javascript variable:
const cPicker = new ColorPicker({
onClickOutside(e){
},
onInput(color){
window['color'] = color;
},
onChange(color){
window['result'] = color;
}
})
And then
it('Should call all callbacks with correct arguments', async() => {
await page.goto(`http://localhost:5000/tests/visual/basic.html`, {waitUntil:'load'})
// Wait until the next frame
await page.evaluate(() => new Promise(requestAnimationFrame))
// Act
// Assert
const result = await page.evaluate(() => window['color']);
// Check the value
})
Check out the latest blogs from LambdaTest on this topic:
Native apps are developed specifically for one platform. Hence they are fast and deliver superior performance. They can be downloaded from various app stores and are not accessible through browsers.
One of the essential parts when performing automated UI testing, whether using Selenium or another framework, is identifying the correct web elements the tests will interact with. However, if the web elements are not located correctly, you might get NoSuchElementException in Selenium. This would cause a false negative result because we won’t get to the actual functionality check. Instead, our test will fail simply because it failed to interact with the correct element.
Smartphones have changed the way humans interact with technology. Be it travel, fitness, lifestyle, video games, or even services, it’s all just a few touches away (quite literally so). We only need to look at the growing throngs of smartphone or tablet users vs. desktop users to grasp this reality.
As part of one of my consulting efforts, I worked with a mid-sized company that was looking to move toward a more agile manner of developing software. As with any shift in work style, there is some bewilderment and, for some, considerable anxiety. People are being challenged to leave their comfort zones and embrace a continuously changing, dynamic working environment. And, dare I say it, testing may be the most ‘disturbed’ of the software roles in agile development.
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!!