こんにちは
Mozilla Firefoxの拡張機能を作成することに関するHabrの記事がたくさんあります。
検索を使用すると、たとえば、 
here 、 
here 、 
here 、さらに
hereの情報を見つけることができます。
しかし、有効な拡張機能に関する記事はまだありません(もしあれば)。
同時に、開発者向けの拡張機能のバリデーターは長い間存在していました。 
ここのページの下部で、ログインするにはログインが必要です。
あなたの許可を得て、上記の記事に記載されている情報をコピーしません。
代わりに、「有効な」アドオンを作成するための一般原則を説明しようとします。
そして、いくつか例を挙げてリンクを投げます。
- eval()を使用しないでください。 誰もがこのルールを知っていますが、ここではさらに複雑です。
 
 また、eval()がクロージャであることを常に覚えている人は少ないと思います。
 「スコープ」(スコープ)で宣言されたすべてのものは、eval()に含まれていたコードで利用可能になります。 これを含めると、非常に多くの問題が発生します。 特に、「i」、「str」などのような補助変数名を指定する場合。
 
 
- window.setTimeout()を使用する場合は、常に次のように記述します。
 
 window.setTimeout( function (){<br> [ ]<br> }, ); <br><br> * This source code was highlighted with Source Code Highlighter .
 
 
 第一に、それは有効であり、第二に、それは有効であり、第三にまた有効です。
 
 変数を渡す必要がある場合はどうしますか?
 
 スコープロックを使用してください!
 
 ( function ( [ , Timeout ] ){
 
 window.setTimeout( function (){
 [ ]
 }, );
 
 }( [ , "" Timeout ] ));
 
 * This source code was highlighted with Source Code Highlighter .
 
 
 もちろん、完全に「正しい」オプションがあります-たとえば、これを使用するには:
 
 Components.classes[ '@mozilla.org/timer;1' ].createInstance(Components.interfaces.nsITimer); <br><br> * This source code was highlighted with Source Code Highlighter .
 
 
 しかし、これはすでに「完全に」正しいです。
 
 
- オーバーレイのためにGlobal Scropeを使用することはありません。
 
 これがこれです:
 < toolbarbutton id ="helloButton" label ="&helloworld;" oncommand ="showHello();" /> <br><br> * This source code was highlighted with Source Code Highlighter .
 
 
 避けなければなりません。
 
 ここで何が間違っていますか?
 
 グローバル関数「showHello()」があるわけではありません。
 
 はい、誰もが「サンドボックス内」にあり、文字通り「利用可能」ではないことを知っています
 
 Firefoxスキンのグローバルオーバーレイ。
 
 しかし、これは彼女がグローバルに留まることを妨げません!
 
 少なくともプロジェクトの枠組みの中で...
 
 したがって、彼女の「何か」または「誰か」は「偶然」に...
 
 どうする?
 
 しかし、まだ「 addEventListener 」をキャンセルした人はいません
 
 つまり、次のようにします。
 
 <toolbarbutton id= "helloButton" label= "&helloworld;" />
 
 var gid = function (id){ return window. document .getElementById(id); }
 
 gid( 'helloButton' ).addEventListener( 'command' , function (evt){ our_event_handler(evt); }, false );
 
 * This source code was highlighted with Source Code Highlighter .
 
 
 はい、それは「退屈」ですが、検証はより高価です!
 
自分の人生を困難にするために、他に何を思いつくことができますか:
- XULオーバーレイの場合、「すべてのコード」となるJSファイルを1つだけ作成することが望ましいです(「Highlander」のように、1つだけを残す必要があります)。
 
 さらに、このファイルのコード全体は、次のようにクロージャー内にあります。
 
 ( function (){
 var e;
 try {
 
 [ ]
 
 } catch (e){ window.alert(e); }
 })();
 
 * This source code was highlighted with Source Code Highlighter .
 
 
 
- 「多数のディレクトリ内の多数の小さなファイル」上にコードを「分散」させますか?
 
 それも可能です!
 
 var JS_Loader = function ( path_to_file, object_where_file_will_be_loaded ){
 
 Components.classes[ '@mozilla.org/moz/jssubscript-loader;1' ]
 .getService(Components.interfaces.mozIJSSubScriptLoader)
 .loadSubScript( path_to_file , object_where_file_will_be_loaded ); }
 }
 
 var our_scope_object = {};
 
 // USING:
 
 JS_Loader( 'some_path to chrome:// or resource://' , our_scope_object);
 
 /*
 
 , "" 'some_path' our_scope_object.
 , 'some_path' this our_scope_object
 
 */
 
 * This source code was highlighted with Source Code Highlighter .
 
 
 既知の「グリッチ」が原因で、また、検証中に警告が失敗するという事実のために、このオプションがあなたに合わない場合は、「絶対に正しい」ことを行う必要があります:
 
 Components.utils.import( path_to_file , object_where_file_will_be_loaded )
 
 * This source code was highlighted with Source Code Highlighter .
 
 
 ただし、わずかに異なる「トラブル」が発生します。
 
 
- 一般に、もちろん、コントロールのすべての「ハング」 addEventListenerアクションを個別の関数に削除できます...しかし、存在しないコントロールにイベントを登録しようとすると、「インシデント」があることを覚えておく必要があります。
 
 とりわけ、これは私たちを助けます!:
 
 window.addEventListener( "aftercustomization" , function (evt){
 
 [ , <br> , toolbar ]
 
 }, false );
 
 * This source code was highlighted with Source Code Highlighter .
 
 
 
最後に、いくつかの「楽しい」ささいなことをさせてください。
「拡張」プロパティを操作します。var ADDON_ID = '[ em:id install.rdf ]' ;
var EXTENSION = {};
if (Application.extensions){ EXTENSION = Application.extensions.get(ADDON_ID); }
else { Application.getExtensions( function (extensions){ EXTENSION = extensions.get(ADDON_ID); }); }
return {
ext : function (){ return EXTENSION; }
, ver : function (){ return EXTENSION.version; }
}
* This source code was highlighted with Source Code Highlighter .
ファイルシステム内の拡張機能へのパス:var addonLocation = '' ;
Components.utils.import( "resource://gre/modules/AddonManager.jsm" );
AddonManager.getAddonByID( '[ em:id install.rdf ]' , function (addon) {
addonLocation = addon.getResourceURI( "" ).QueryInterface(Components.interfaces.nsIFileURL).file;
} );
* This source code was highlighted with Source Code Highlighter .
ブリンカー...var blinker = function (cnt){
for ( var i = 1; i < cnt; i++){
( function (ist){
// window.alert('' + ist + ' ' + (ist % 2));
window.setTimeout( function (){ show_status((ist % 2)); }, ist*450 );
})(i);
}
}
/*
  
show_status, , 1 0
"" , - ""
  
*/
* This source code was highlighted with Source Code Highlighter .
結論として、いくつかのリンクを提供したいと思います。
コメント不要: 
addons.mozilla.org/en-US/developersMozilla開発者ネットワーク: 
developer.mozilla.org/en-USこれを注意深く見ていきます。
XUL仕様: 
developer.mozilla.org/en/XULdeveloper.mozilla.org/en/JavaScriptdeveloper.mozilla.org/en/DOMdeveloper.mozilla.org/en/XUL_Overlaysdeveloper.mozilla.org/en/XUL_controlsそして、これは必見です!:
developer.mozilla.org/en/Setting_up_extension_development_environmentdeveloper.mozilla.org/en/Extension_Frequently_Asked_Questionsdeveloper.mozilla.org/en/Creating_toolbar_buttonsdeveloper.mozilla.org/en/XUL_School/Adding_Toolbars_and_Toolbar_Buttonsdeveloper.mozilla.org/en/XUL_School/Adding_Events_and_Commandsdeveloper.mozilla.org/en/Addons/Add-on_Manager/Code_Samplesdeveloper.mozilla.org/en/chrome_registrationdeveloper.mozilla.org/en/XPCOM_Interface_Reference/mozIJSSubScriptLoaderそして、いつの日か、おそらく覚えておいてください...:
developer.mozilla.org/en/Code_snippetsdeveloper.mozilla.org/en/XUL_School/Handling_Preferencesdeveloper.mozilla.org/en/Security_best_practices_in_extensions