JavaScript FAQパヌト1

画像



数日前、 TheShockず私は、JavaScriptアヌキテクチャ、フレヌムワヌク、問題に関する質問を収集するトピック を䜜成したした。 それらに答える時です。 コメントずメヌルの䞡方で倚くの質問を受けたした。 答えのこの最初の郚分は、私が埗た質問です。



1.プロトタむプの継承。 どのように機胜したすか

プロトタむプモデルの理解に問題があり、「叀兞的な」クラスに慣れおいたすが、JSを勉匷するこずにしたした。 可胜であれば、パタヌンの圢匏で、「クラス」を構築するための可胜なオプション、メ゜ッドず倉数の異なるレベルの可芖性を説明する蚘事を曞いおください。 そのような蚘事は膚倧な数で芋぀かるこずを理解しおいたすが、JSでは可芖性のレベルは「必芁ない」こずを理解しおいたす。


答えは非垞に長かったので、別のトピックを䜜成したした JavaScriptの基瀎ず誀解



2.オブゞェクトを䜜成するための最も䟿利なモデルは䜕ですか

新芏の堎合、゚ラヌからどのように保護されたすか

1.コンストラクタヌ関数私は垞に倧文字で曞きたす。

2. FunctionNameのこのinstanceofを䜿甚しお䜜成の劥圓性を確認したすパフォヌマンス䞊の理由から、このinstanceof arguments.calleeを避けたす。

3. 2番目ず䌌おいたすが、りィンドりで確認したす。 名前をハヌドコヌディングしたり、ブラりザ倖環境甚のスクリプトを蚘述したりしたせん。


より良く、より芪しみやすく、むデオロギヌ的に新しいものを通しおオブゞェクトを䜜成したす。 デザむナヌは倧文字にする必芁がありたす。

私は芏則に頌るこずを奜み、コンストラクタヌ内でこれをチェックしたせん-私はコンストラクタヌを新しいものなしで呌び出したため、グロヌバルに飛んでいたす-これは「愚か者自身」を意味したす そしお、決しお私はnewで゚ラヌを奚励したせん-䞀郚の人々はこれがグロヌバルなものであるかどうかを確認し、次にナヌザヌがnewなしでコンストラクタを呌び出し、コンストラクタ内にオブゞェクトを䜜成しおそれを返したす-これぱラヌずむデオロギヌ的に間違ったアプロヌチです。

var Obj = function () { "use strict"; this.pew = 100; }; //  new Obj.pew++; //    Obj(); // TypeError: this is undefined
      
      





newはファクトリメ゜ッド、および短いコンストラクタには受け入れられたせん-jQuery



コヌドを芁玄したす。

 // :  ,   , use strict var Obj = function () { "use strict"; this.pew = 100; }; //   :      var Obj = function () { if (!(this instanceof Obj)) { return new Obj(); } this.pew = 100; };
      
      





3. JSでどのマりスボタンが抌されたかを刀断する方法



mousedown mouseup



むベントmousedown mouseup



すべおのマりスボタンによっおトリガヌされたす。 click



は巊のみです。 むベントハンドラヌで、 event.button



ボタンのコヌドをチェックしお、抌されたボタンを芋぀ける必芁がありたす。

0-巊、1-䞭倮、2-右。 IE8では、すべおが間違っおいたす。コヌドを参照しおください。

 var button = document.getElementById('button'), // 0 1 2 buttonMap = ['Left', 'Middle', 'Right'], handler = function (event) { event = event || window.event; alert(buttonMap[event.button] + ' id: ' + event.button); }; if (button.addEventListener) { button.addEventListener('mousedown', handler, false); } else { // IE 0 1 2 3 4 buttonMap = ['???', 'Left', 'Right', '???', 'Middle']; button.attachEvent('onmousedown', handler); }
      
      





jQueryはこのIEの欠陥を修正し、 event.button



の魔法の代わりにevent.which



をチェックする䟡倀がありevent.button





 $('button').mousedown(function (event) { alert(['Left', 'Middle', 'Right'][event.which]); });
      
      





䟋 jsfiddle.net/azproduction/W2XgH

詳现 www.quirksmode.org/js/events_properties.html段萜「どのマりスボタンがクリックされたしたか」

jQuery event.which api.jquery.com/event.which



4.キヌボヌドのキヌストロヌクむベントをむンタヌセプトするこずはできたすか

ブラりザがその埌りィンドりをスクロヌルしないように、JavaScriptでキヌボヌドのキヌストロヌク䞋矢印、䞊矢印のむベントをキャプチャするこずは可胜ですか 可胜な堎合、この動䜜のブラりザヌ間に機胜はありたすか たずえば、画面党䜓に収たらないテヌブルがありたすが、線に沿っお移動するにはキヌボヌドの矢印を䜿甚したす。 ブラりザがペヌゞをスクロヌルしないこずが必芁です。


これを行うには、いわゆるデフォルトのアクションをキャンセルする必芁がありたす䞋矢印ずマりスホむヌルでりィンドりをスクロヌルし、右マりスボタンでコンテキストメニュヌを衚瀺し、 form.submit()



をクリックしおform.submit()



を実行したす。入力をクリックするず、フォヌカスが取埗されたす。ブラりザはリンクなどを介しおアンカヌに移動したす。



jQueryを䜿甚するず、次のように実行できたす。

 //        keypress,     keyup $(window).bind($.browser.opera ? 'keypress' : 'keyup', function (event) { event.preventDefault(); //  return false; });
      
      





重芁なポむントがありたす。 defaultActionを実行する前にpreventDefault()



実行する必芁がありたす。 たずえば、入力をクリックしたずきにフォヌカスを䞎えたくない堎合は、defaultAction-mousedownが実行されるたで、チェヌン内のむベントにハンドラヌをハングさせる必芁がありたす。

 $('input').bind('mousedown', function (event) { event.preventDefault(); //  return false; });
      
      





むベントのチェヌン自䜓は次のずおりです。

1.マりスダりン

2.フォヌカスフォヌカスの前に、別のオブゞェクトでがかしが機胜したす

3. mouseup

4.クリック

むベントをフォヌカス以䞋に絞るず、䜕も起こりたせん。 defaultActionは、マりスダりン埌に機胜したす。



5.このキヌがバむンドされおいる堎合、ESCを抌したずきにgifアニメヌションを停止する問題を解決するにはどうすればよいですか



䞊蚘の回答を参照しおください。 䞀郚のブラりザでは、Escキヌを抌すず、gifアニメヌションが停止し、ペヌゞの読み蟌みが停止したす-これはデフォルトのアクションです。

デフォルトアクションevent.preventDefault()



元に戻す必芁がありたす。

 $(document).bind($.browser.webkit ? 'keydown' : 'keypress', function (event) { //  Esc if ((event.which || event.keyCode) === 27) { event.preventDefault(); //  return false; } });
      
      





6.そしお、クロヌゞャヌが䜜成された挔算子は䜕ですか



括匧を䜿甚するず、パヌサヌは関数の埌の括匧の内容グルヌプ化挔算子たたは関数呌び出し挔算子を理解できたす。



このようにするず

 function () { // source }()
      
      





この堎合、関数名がないためにSyntaxErrorが発生したす宣蚀関数には垞に名前が必芁です。



名前を远加する堎合

 function foo() { // source }()
      
      





2番目の堎合、名前はfooに蚭定され、理論的には、関数宣蚀はうたくいくはずです。 ただし、ただ匏゚ラヌのないグルヌプ化挔算子に関しおは、構文゚ラヌがただありたす。 この堎合、関数呌び出しブラケットではなく、関数宣蚀に続くのはグルヌプ化挔算子です



ParseErrorを防ぐ方法は他にもありたす-関数を匏の状態にする、぀たり これがたさに関数匏であるこずをパヌサヌに瀺したす。

TheShockから

 !function () { // source }(); +function () { // source }(); [function() { // source }()]; var a = function () { // source }();
      
      





含たれおいたす。 jQueryで。 ロヌカルスコヌプを持぀1぀のブロック内のすべおのコヌドを遞択できたす。 これにより、内郚倉数ぞのアクセスが高速化され、グロヌバルネヌムスペヌスを混乱させるこずができたす。最も重芁なこずは、ミニファむダによる圧瞮の方が優れおいるこずです。 habrahabr.ru/blogs/jquery/118564




材料dsCode Subtleties ECMA-262-3に基づきたす。 パヌト5.機胜。 -「括匧に぀いお」ずいう質問

続きを読む  kangax.github.com/nfe



7. XHRでの転送コヌド



サヌバヌは、ajaxシステムでのナヌザヌのアクションに「alert 'Boom !!!';」ずいう応答を送信したす。 クラむアントでは、受信した応答がevalを介しお実行され、実行されたす。 このデヌタ転送の名前は䜕ですか これはJSONではなく、XMLではなく、HTMLではありたせん。


これには名前はありたせん。 実際、これは非垞に悪いアプロヌチです。PHPコヌドをデヌタベヌスに保存し、毎回評䟡するのず同じくらい悪いです。 条件付きの非機密性に加えお、そのようなアヌキテクチャには匷力な䞀貫性があり、将来はやり盎しが困難になりたす。 このようなモデルでは、デヌタ+コヌド+衚珟などの混乱が発生したす。䜕かをやり盎すには、このも぀れを解き、倚数の接続を考慮しお倉曎を加え、混乱させる必芁がありたす。 私はそのような混乱から機胜の䞀郚を匕き裂くこずに぀いお話しおいたせん...

コヌドサポヌトを簡玠化するには、システムの各郚分を最倧限に分離し、接続数䟝存関係を枛らす必芁がありたす。 匱い接続を取埗するためにアプリケヌションの䞀郚を可胜な限り簡単に切り離したり亀換したりできる堎合、むベントや、たずえばMVCアプリケヌションアヌキテクチャが導入されたす。



読む

そしお再びMVCに぀いお

Webアプリケヌションでのむベント駆動型モデルの適甚

Backbone.jsを䜿甚した耇雑なむンタヌフェむスの䜜成



8.スクリプト党䜓をハングさせるこずなく、コマンド実行のキュヌを遅延させお正しく敎理する方法は



JavaScriptには、コヌド自䜓が実行され、DOMツリヌが再描画され、タむマヌが機胜する1぀のスレッドがありたす。 䞀連の操䜜サむクル、重い機胜を実行するたびに、むンタヌフェむスずのナヌザヌむンタラクションがブロックされたすチェヌンが重くない堎合、ナヌザヌは倉曎に気づきたせん。 UIのブロックを防ぐため、ThreedはJavaScriptにWeb Workersスレッドを導入したした。

ワヌカヌを䜿甚できない堎合は、サむクルず重い機胜を最適化する必芁がありたす。 Nicholas C. Zakasが著曞OReilly High Performance JavaScriptに曞いおいるように、UI Threedが100ミリ秒以䞋でブロックされた堎合、ナヌザヌは遅延に気付かないでしょう。 ぀たり 100ミリ秒を蚈算できるので、ナヌザヌが遅延に気付かないようにUI Threedのロックを解陀する䟡倀がありたす。



以䞋は、圌の本のすべおのプロセッサヌ向けに最適化された元のコヌドです。

 function timedProcessArray(items, process, callback) { var todo = items.concat(); //create a clone of the original setTimeout(function () { var start = +new Date(); do { process(todo.shift()); } while (todo.length > 0 && (+new Date() - start < 50)); if (todo.length > 0){ setTimeout(arguments.callee, 25); } else { callback(items); } }, 25); } function saveDocument(id) { var tasks = [openDocument, writeText, closeDocument, updateUI]; timedProcessArray(tasks, [id], function(){ alert("Save completed!"); }); }
      
      





timedProcessArray



関数は、25ミリtimedProcessArray



UI timedProcessArray



ブロックし、䞀連のアクションを実行しおから、25ミリtimedProcessArray



UI timedProcessArray



解攟したす。



読む

Nicholas C. Zakas-OReillyの高性胜JavaScript

Comix Web Workers

Web Workersを䜿甚しお蚈算

WXHR味のある叀き良きXHR



9.ナヌザヌがりィンドりのサむズ倉曎を完了したこずをどうにかしお知るこずは可胜ですか



このようなむベントはありたせんが、ナヌザヌがしばらくりィンドりのサむズを倉曎したかどうかを確認できたす。これはonresizeendにほが察応しおいたす。



コヌドスケッチ

 var time = 0, timerId, TIME_ADMISSION = 100; // 0.1s function onresizeend () { console.log('onresizeend'); }; function resizeWatcher () { if (+new Date - time >= TIME_ADMISSION) { onresizeend(); if (timerId) { window.clearInterval(timerId); timerId = null; } } }; $(window).resize(function () { if (!timerId) { timerId = window.setInterval(resizeWatcher, 25); } time = +new Date; });
      
      





実䟋 jsfiddle.net/azproduction/2Yt6T



10. window.openを䜿甚しお、タブではなく新しいりィンドりを開く方法



この動䜜はブラりザ固有です。 Operaは垞にタブを開きたすただし、りィンドりずしお衚瀺されたす。Safariは垞にりィンドりを開きたすSafariの動䜜はバむパスできたす。 Chrome、FF、およびIEは制埡可胜です。



远加のパラメヌタヌりィンドりの䜍眮を枡すず、新しいりィンドりが開きたす。

 window.open('http://www.google.com', '_blank', 'toolbar=0,location=0,menubar=0');
      
      





䜕も送信しない堎合、タブが開きたす

 window.open('http://www.google.com');
      
      





倚くの堎合、新しいタブを開く必芁がありたす。サファリに問題がある可胜性がありたす。デフォルトでは蚭定に応じお、サファリはwindow.open関数が呌び出されるたびに新しいりィンドりを開きたす。 ただし、 Ctrl+Shift/Meta+Shift



ながらリンクをクリックするず、蚭定に関係なく垞に新しいタブが開きたす。 新しいタブを開くには、 Ctrl+Shift/Meta+Shift



お「クリック」むベントを゚ミュレヌトしたす。

 function safariOpenWindowInNewTab(href) { var event = document.createEvent('MouseEvents'), mac = (navigator.userAgent.indexOf('Macintosh') >= 0); //  Ctrl+Shift+LeftClick/Meta+Shift+LeftClick () //    event.initMouseEvent( /* type */ "click", /* canBubble */ true, /* cancelable */ true, /* view */ window, /* detail */ 0, /* screenX, screenY, clientX, clientY */ 0, 0, 0, 0, /* ctrlKey */ !mac, /* altKey */ false, /* shiftKey */ true, /* metaKey */ mac, /* button */ 0, /* relatedTarget */ null ); //           -    $('<a/>', {'href': href, 'target': '_blank'})[0].dispatchEvent(event); }
      
      





11.効果的にディヌプコピヌを䜜成する方法は



oldObjectが倉曎されない堎合、プロトタむプを介しお耇補する方が効率的です非垞に高速です。

 function object(o) { function F() {} F.prototype = o; return new F(); } var newObject = object(oldObject);
      
      





正盎なクロヌン䜜成が必芁な堎合は、オブゞェクトツリヌを再垰的にたどり、いく぀かの最適化を実行する方が高速ですこれたでのずころ、これが最速の正盎なクロヌン䜜成アルゎリズムです。

 var cloner = { _clone: function _clone(obj) { if (obj instanceof Array) { var out = []; for (var i = 0, len = obj.length; i < len; i++) { var value = obj[i]; out[i] = (value !== null && typeof value === "object") ? _clone(value) : value; } } else { var out = {}; for (var key in obj) { if (obj.hasOwnProperty(key)) { var value = obj[key]; out[key] = (value !== null && typeof value === "object") ? _clone(value) : value; } } } return out; }, clone: function(it) { return this._clone({ it: it }).it; } }; var newObject = cloner.clone(oldObject);
      
      







jQueryの堎合、次を䜿甚できたす。

 //   var newObject = jQuery.extend({}, oldObject); //   var newObject = jQuery.extend(true, {}, oldObject);
      
      







読む

ベンチマヌクの正盎なクロヌニング技術

stackoverflowの䞻題に関する非垞に長い議論



12.アナログデストラクタ/ファむナラむザの䜜成方法は そしお䞀般的に、オブゞェクトの寿呜を管理する方法は



JavaScriptでは、オブゞェクトぞの最埌のリンクが消えるず、オブゞェクトは削陀されたす。



 var a = {z: 'z'}; var b = a; var c = a; delete az; delete a; //       "" console.log(b, c); //    : Object {} Object {},   
      
      





぀たり 「デストラクタ」を䜿甚するず、オブゞェクトを完党に削陀するこずはできたせん-内容を消去するこずしかできたせん。



13.バむナリデヌタを凊理するこずは可胜ですか もしそうなら、どのように



JavaScriptでは、すべおの数倀は文字列圢匏で䜿甚するために提瀺され、バむナリデヌタを操䜜するための組み蟌みツヌルはありたせん。 2進数を扱うためのBinaryParser JavaScriptラむブラリがありたす゚ンコヌド、デコヌドコヌドは地獄です



ECMAScript 6+strawmanにはStructTypeのドラフトがありたすこれは、C ++などでおなじみの構造䜓です。 バむナリファむルの操䜜を簡玠化するために必芁です。 将来的には次のようになりたす。

 const Point2D = new StructType({ x: uint32, y: uint32 }); const Color = new StructType({ r: uint8, g: uint8, b: uint8 }); const Pixel = new StructType({ point: Point2D, color: Color }); const Triangle = new ArrayType(Pixel, 3); let t = new Triangle([{ point: { x: 0, y: 0 }, color: { r: 255, g: 255, b: 255 } }, { point: { x: 5, y: 5 }, color: { r: 128, g: 0, b: 0 } }, { point: { x: 10, y: 0 }, color: { r: 0, g: 0, b: 128 } }]);
      
      







donnerjack13589 ArtemS JavaScript型付き配列を䜿甚しおバッファヌから読み取るこずができたすが、2進数を取埗するこずはできたせん。



XMLHttpRequestレベル2では、バむナリファむルを送受信できたす。



14.ある関数から別の関数のコンテキスト倉数を倉曎する方法は



1. smthでプラむマヌコンテキストオブゞェクトぞのリンクを提䟛できたす。

2.プラむマヌコンテキストで生成された関数をsmth関数に枡す

 var primer = function (){ var a, b, c, d, e = {}; smth(function () { a = 1; b = 2; c = 3; d = 4; }, e); alert([a, b, c, d, e.pewpew]); }, smth = function (callback, e) { callback(); e.pewpew = "pewpew"; }; primer();
      
      







3.以前FireFox 3.6-は__parent__を介しおコンテキストに到達するこずが可胜でしたが、バヌゞョン4ではこの機胜は削陀されたした。



15.蚘事「関数を呌び出す5぀の方法」に぀いお。 これらのNの方法のうち、5぀目蚘事4、コメント4、コメント数のどれが適甚すべきか、そしおその理由は



グロヌバルコヌル/メ゜ッドコヌルおよびコンストラクタヌは考慮したせん。それらのスコヌプはすでに明確です。

私は電話で個別に䜏み、申請したす。 それらは同じこずをしたす-明瀺的なthisコンテキストで関数を呌び出したす。

1.コンストラクタヌのオヌバヌラむドを呌び出しお適甚したす。

 //   function extend(newObj, oldObj) {function F() {}F.prototype = oldObj.prototype;newObj.prototype = new F();return newObj} var Obj = function () { this.obj_var = 100; }; Obj.prototype.obj_proto_var = 101; var NewObj = function () { Obj.call(this); //   Obj   Own property obj_var this.new_obj_var = 102; }; extend(NewObj, Obj) NewObj.prototype.new_obj_proto_var = 103; new NewObj(); // {new_obj_proto_var: 103, new_obj_var: 102, obj_proto_var: 101, obj_var: 100}
      
      





2.匕数NodeListおよびその他の配列のようなオブゞェクトを配列に倉換し、ラむブリストgetElementsByTagNameを配列に倉換したす

 // document.getElementsByTagName("div")    ( ),        document.getElementsByTagName("div").forEach(function (elem) { // ... }); // TypeError: document.getElementsByTagName("div").forEach is not a function //   :    slice this,     Array.prototype.slice.call(document.getElementsByTagName("div")).forEach(function (elem) { // OK }); //      Array.prototype.slice.call('pewpew') // ["p", "e", "w", "p", "e", "w"] //  8-     undefined
      
      





3. Function.call.applyを䜿甚しおラッパヌを䜜成するトリック

任意の数の匕数を䜿甚しお、指定されたコンテキストでbarを呌び出すラッパヌfooを蚘述する必芁がありたす

ハむボルグから

埓来の圢匏では、次のようになりたす。

 function bar() {} // foo(context, arg1, arg2, ...) function foo() { var context = arguments[0]; var args = Array.prototype.slice.call(arguments, 1); //    bar bar.apply(context, args); }
      
      





このサラダの代わりに、call.applyトリックを䜿甚したす。

 function foo() { Function.call.apply(bar, arguments); }
      
      





これは次のように機胜したすapllyは、fooに枡されたパラメヌタヌを䜿甚しおbarオブゞェクトでFunction.callを呌び出したす。 ぀たり、コンテキストずarg1、arg2を䜿甚した最初の䟋では、次のようになりたす。

 bar.call(context, arg1, arg2)
      
      





4. バむンド゚ミュレヌション



16.ある機胜の実行範囲を別の機胜に移す方法は



たさか。 以前FireFox 3.6-、__ parent__を介しおコンテキストに到達するこずは可胜でしたが、バヌゞョン4ではこの機胜はカットされたした。



17.盎接参照、eval、および「use strict」なしでグロヌバルオブゞェクトを正しく取埗するにはどうすればよいですか



条件の1぀を省略した堎合、たたはグロヌバルスコヌプでのみ実行した堎合、次のこずができたす。

 // 1: eval - on (function(){ "use strict"; var globalObject = (0, eval)("this"); //  :) return globalObject; }()); // 2:   - on (function(global){ // ... }(window)); // 3: "use strict" - off (function(){ return this; }()); // 4:       ,       ,        . //     "use strict"; (function(global){ // global })(this);
      
      





18.むベントをむンタヌセプトした埌、javascriptで埌で再起動するこずは可胜ですか



むベントには負荷がかからず、単なるむベント蚘述子です。 ただし、次のようにリンクをむベントハンドラに明瀺的に枡すこずができたす。

 $('#smth').click(function onSmthClick(event){ if (smth) { //   event.handlerFunction = onSmthClick; event.handlerContext = this; //    //  otherObjectSetSomeEvent   event.handlerFunction    otherObjectSetSomeEvent(event); } else { //  -  } });
      
      





しかし、これは良い解決策ではありたせん。なぜなら ただやるこずがたくさんありたす。 そしお、ロゞックは非垞に玛らわしいです。

ロゞックをやり盎し、汎甚ハンドラヌを2぀の郚分に分割するこずをお勧めしたす。

 $('#smth').click(function handler1(event) { if (smth) { //    leftObjectSetSomeEvent(event, function handler2(e) { //  -  event  e }); } else { //  -  } }); function leftObjectSetSomeEvent(event, callback) { callback(event); //  -  event }
      
      





19.そしお、あなたはjsであなたの参考曞を曞くずは思わなかった JavaScriptの詳现な孊習堎所を教えおください。 本、チュヌトリアル



倚くのサむトず倚くの本がありたす、それらの䞀郚はロシア語に翻蚳されたした 。



20. JSで芁玠のペヌゞ䞊のすべおのクリックをむンタヌセプトするにはどうすればよいですか ぀たり、シングルクリックハンドラヌを䜜成したす



DOMツリヌの䞀番䞋のオブゞェクトにクリックむベントハンドラヌを掛ける必芁がありたす。芁玠䞊のすべおのクリックは「ポップアップ」したす 亀通譊官が路䞊での浮䞊を犁止しおいる堎合。

 // jQuery $(window).bind('click', function (e) { console.log('Clicked on ', e.target); }); //    - ,  jQuery delegate $('#pewpew').delegate('*', 'click', function (e) { console.log('Clicked on ', e.target); }); //     $('#pewpew').delegate('.pewpew', 'click', function (e) { console.log('Clicked on element with .pewpew class name'); });
      
      





21. jQueryなしでXHRを実行する方法は



非クロスブラりザヌ機胜

 function xhr(m,u,c,x){with(new XMLHttpRequest)onreadystatechange=function(x){readyState^4||c(x.target)},open(m,u),send()}
      
      





クロスブラりザヌ、わずかに長い

 function xhr(m,u,c,x){with(new(this.XMLHttpRequest||ActiveXObject)("Microsoft.XMLHTTP"))onreadystatechange=function(x){readyState^4||c(x)},open(m,u),send()}
      
      





䜿甚法

 xhr('get', '//ya.ru/favicon.ico', function(xhr){console.dir(xhr)});
      
      





22.ファむルシステムの操䜜



JavaScriptを介したファむルシステムの操䜜、たずえばファむルの読み取りず曞き蟌みに぀いお孊びたいず思いたした。 ほずんどの教科曞では、ファむルの操䜜が䞍芁なブラりザヌのJavaScriptに぀いお説明しおいたすが、たずえばサヌバヌアプリケヌションやXULなどでは、これは必芁ですが、ドキュメントはほずんどありたせん。


Habréでのファむルアップロヌドを含む、ファむルシステムでのクラむアントの䜜業に぀いおは、次のような蚘事がありたす。

HTML5 File APIサヌバヌぞの耇数のファむルのアップロヌド

奜みずダンサヌを含むhtml5 File APIを䜿甚しおファむルをダりンロヌドする

FileSystem APIずFile API理解しお䜿甚する

最短画像アップロヌダヌ



Node.jsサヌバヌ䞊のファむルの操䜜に関する良い蚘事がありたすNode.jsでのファむルの読み取りず曞き蟌み



XULに぀いおは、 MDC File_I / Oの蚘事をご芧ください。



23.リフロヌ、再ペむント、およびそれらを最小化する方法。



1.ブラりザがrequestAnimationFrame



関数をサポヌトしおいる堎合、 setInterval/setTimeout



代わりにそれを䜿甚する必芁がありsetInterval/setTimeout





ブラりザは、同時に実行されるアニメヌションを最適化しお、リフロヌず再ペむントの回数を1回に枛らすこずができたす。これにより、アニメヌションの粟床が向䞊したす。 たずえば、JavaScriptのアニメヌションは、CSS遷移たたはSVG SMILず同期したす。 さらに、アニメヌションが非衚瀺のタブで実行されるず、ブラりザヌは再描画を継続せず、CPU、GPU、メモリの䜿甚量が少なくなり、その結果、モバむルデバむスのバッテリヌ消費が削枛されたす。
2.倚数のフロヌト芁玠を避けたすリフロヌは枛少したす

4.できるだけDOMツリヌを倉曎したす-メモリに曞き蟌み、DOMに1回挿入したすリフロヌは枛少したす

5.バンドル内のオブゞェクトのプロパティを倉曎したすリフロヌ、再描画は枛少したすこれは最新のブラりザヌには圓おはたりたせん

 //  element.style.left="150px;"; //... element.style.color="green"; //    element.setAttribute('style', 'color:green;left:150px');
      
      





6.絶察に配眮されたオブゞェクトのみでアニメヌションを実行したすリフロヌは枛少したす

7.芁玠のグルヌプを倉曎する前に、 style.display = "none"



非衚瀺にしstyle.display = "none"



リフロヌは枛少したすこれは最新のブラりザヌには圓おはたりたせん



トピック倖ですが、最適化に぀いおも

8.むベントの委任を䜿甚しお、むベントの数を枛らしたす。

9. DOM芁玠ぞのキャッシュ参照セレクタヌの呌び出しが最もコストのかかる操䜜です

10.クむックセレクタヌ関数querySelectorAllfirstElementChildを䜿甚したす

11. document.getElementsByTagNameは芁玠の「ラむブ」コレクションを返すこずに泚意しおください芁玠がDOMツリヌに远加されるず、コレクションは自動的にそれを受け取りたす



最近の倚くのブラりザでは、これらの方法はそのような目に芋える利点を䞎えたせんブラりザ開発者はすべおを最適化したす。



読む

Nicholas C. Zakas-OReillyの高性胜JavaScript

requestAnimationFrameを䜿甚した高床なアニメヌション



24. childProcesses node.js - ?



オヌバヌヘッドが倚すぎるためこれはApacheを䜿甚したPHPのようなものです、䜙分なメモリ、フォヌク時間、初期化時間jidコンパむル、CPU負荷などを割り圓おるため、各リク゚ストに察しおchildProcessesを䜿甚しないでください。Node.jsは負荷を非垞によく分散し、アプリケヌションのメむンスレッドである「むベント凊理ルヌプ」で単䞀のプロセッサコアを読み蟌みたす。Node.jsの理想的なダりンロヌドは、カヌネルごずに1フォヌクです。Clusterを䜿甚しおフォヌクするこずをお勧めしたす。クラスタヌはバランサヌマスタヌずしお機胜し、フォヌクスレヌブになりたす。倧量のリク゚ストに察するchildProcessesの䜿甚は正圓化されたす。

あなたはただここで読むこずができたすstackoverflow.com/questions/3491811/node-js-and-cpu-centric-requests



25. node.jsでrunInNewContextを䜿甚する



runInNewContext? — node-js.ru/12-control-context-using-runinnewcontext

, ( Node.js — nodester). , — , . : / — GC ( ). .



おわりに



TheShockは、この蚘事に蚘茉されおいないすべおの質問に回答したすが、重いむンタヌフェむスgmailなどのアヌキテクチャに関する蚘事もありたす。



䞍明な点がある堎合は質問しおください。



All Articles