Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
uupaa edited this pageJun 5, 2015 ·69 revisions

このエントリでは、WebModule に使われている 実装パターン(WebModulePattern) について紹介しています。

WebModulePattern は、どこでも動作し、I/Fと実装が分離された見通しの良いモジュールを記述するためのコードパターンです。以下のように記述すると、Browser, Node.js, Worker, NW.js で動作するモジュールを構築できます。

WebModulePattern

以下は、モジュールを定義する部分のコードを抜粋したものです。
function MyExampleGLOBAL.WebModule.MyExample として export しています。
GLOBALWebModuleIdiom を使って導き出しています。

GLOBAL["WebModule"]["exports"]("MyExample",function(global){"use strict";functionMyExample(){ ...}returnMyExample;// return entity});

entity に対して何か追加で行う場合や、GLOBAL.WebModule に依存したくない場合は、クロージャ関数(この例では moduleExporter と moduleClosure) を追加で導入し、以下のように記述してください。

(functionmoduleExporter(moduleName,moduleClosure){// http://git.io/WebModule"use strict";varentity=GLOBAL["WebModule"] ?GLOBAL["WebModule"]["exports"](name,closure)                                     :closure(GLOBAL);// entity に対する操作returnentity;})("MyExample",functionmoduleClosure(global){functionMyExample(){ ...}returnMyExample;// return entity});

共通コード

GLOBAL を導き出すコードGLOBAL.WebModule.exports 関数などの共通コードは、別ファイル(WebModule.js)に記述し、MyExample.js より先にロードしておきます。

// http://git.io/WebModule// --- global variables ------------------------------------// https://github.com/uupaa/WebModule/wiki/WebModuleIdiomvarGLOBAL=GLOBAL||(this||0).self||global;// --- environment detection -------------------------------GLOBAL.IN_NODE_OR_NW=!!GLOBAL.global;GLOBAL.IN_BROWSER=!GLOBAL.IN_NODE_OR_NW&&"document"inGLOBAL;GLOBAL.IN_WORKER=!GLOBAL.IN_NODE_OR_NW&&"WorkerLocation"inGLOBAL;GLOBAL.IN_NODE=GLOBAL.IN_NODE_OR_NW&&!/native/.test(setTimeout);GLOBAL.IN_NW=GLOBAL.IN_NODE_OR_NW&&/native/.test(setTimeout);// --- validate and assert functions -----------------------// https://github.com/uupaa/WebModule/wiki/ValidateGLOBAL.$type=function(value,types){returnGLOBAL["Valid"] ?GLOBAL["Valid"].type(value,types) :true;};GLOBAL.$keys=function(value,keys){returnGLOBAL["Valid"] ?GLOBAL["Valid"].keys(value,keys)  :true;};GLOBAL.$some=function(value,candidate,ignoreCase){returnGLOBAL["Valid"] ?GLOBAL["Valid"].some(value,candidate,ignoreCase) :true;};GLOBAL.$args=function(api,args){if(GLOBAL["Valid"]){GLOBAL["Valid"].args(api,args);}};GLOBAL.$valid=function(value,api,highlihgt){if(GLOBAL["Valid"]){GLOBAL["Valid"](value,api,highlihgt);}};// --- WebModule ------------------------------------------GLOBAL.WebModule={exports:function(name,closure){varalias=nameinGLOBAL ?(name+"_") :name;varentity=aliasinthis ?this[alias]                                   :this[alias]=closure(GLOBAL);if(typeofexports!=="undefined"){module["exports"]=entity;}returnentity;}};

古いスタイルで書かれたコードを WebModulePattern に書き直す方法 についても参照してください。

ES6::Modules への対応

TBD: このセクションは推敲や検証が終わっていません。

WebModulePattern で書かれたコードを ES6::Modules の export に対応させるには先頭に1行追加します。

export// この行を追加GLOBAL["WebModule"]["exports"]("MyExample",function(global){"use strict";functionMyExample(){ ...}returnMyExample;// return entity});
Clone this wiki locally

[8]ページ先頭

©2009-2025 Movatter.jp