次のようなUMDモジュールがあるとします('js/mymodule.js'に保存):
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.AMD ? define(['exports'], factory) :
(factory((global.mymodule = global.mymodule || {})));
}(this, function (exports) { 'use strict';
function myFunction() {
console.log('hello world');
}
}));
このようなHTMLファイルでこのモジュールを使用するにはどうすればよいですか? (requirejs、commonjs、systemjsなどなし...)
<!doctype html>
<html>
<head>
<title>Using MyModule</title>
<script src="js/mymodule.js"></script>
</head>
<body>
<script>
/* HOW TO USE myFunction from mymodule.js ??? */
</script>
</body>
</html>
助けてくれてありがとう。
それでは、RequireJS、CommonJS、SystemJSなどのない環境で実行しています。
重要な行はfactory((global.mymodule = global.mymodule || {}))
です。これはいくつかのことを行います。
_global.mymodule
_が真実の場合、次と同等です。
_global.mymodule = global.mymodule // A noop.
factory(global.mymodule)
_
それ以外の場合は、次と同等です。
_global.mymodule = {}
factory(global.mymodule)
_
ファクトリー内:ファクトリーは、exports
に割り当てて、モジュールからエクスポートするものをエクスポートする必要があります。したがって、_exports.myFunction = myFunction
_を実行してmyFunction
をエクスポートします。
工場の外:外では、エクスポートされた値はグローバルスペースにエクスポートされたmymodule
にあります。たとえば、myFunction
を使用する場合は、mymodule.myFunction(...)
を実行します。
それが明確でない場合。コードのファクトリーはfunction (exports) {
で始まる関数で、myFunction
を正しく配置しています。
簡単な答え:通常のUMDを使用している場合は、window.mymodule
(またはlibの名前)。
以下に例を示します レンダーUMD Reactコンポーネント :
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<script src="https://unpkg.com/[email protected]/umd/react.development.js"></script>
<script src="https://unpkg.com/[email protected]/umd/react-dom.development.js"></script>
<script src="my-component.js"></script>
<title>React App</title>
</head>
<body>
<div id="root"></div>
<script>
ReactDOM.render(
React.createElement(MyComponent),
document.getElementById('root')
);
</script>
</body>
</html>
現在の形式では、myModule(jsからmyFunction()を使用することはできません。 myModule.jsは何も公開(エクスポート)していません。最初にこの行をmyModule.jsに追加する必要があります
exports.myFunction = myFunction;
あなたのモジュールコードは次のようになります:
(function(global, factory) {
typeof exports === 'object'
&& typeof module !== 'undefined'
? factory(exports) :
typeof define === 'function'
&& define.AMD
? define(['exports'], factory) :
(factory(
(global.mymodule = global.mymodule || {})
)
);
}(this, function(exports) {
'use strict';
function myFunction() {
console.log('hello world');
}
// expose the inner function on the module to use it
exports.myFunction = myFunction;
}));
このコードを.htmlファイルで実行すると、ブラウザは、このメソッド 'myFunction'を持つ 'mymodule'というグローバルオブジェクトを作成します。
このメソッドは、.htmlファイルで次のように呼び出すことができます。
myModule.myFunction();
完全な.htmlファイルは次のようになります。
<!doctype html>
<html>
<head>
<title>Using MyModule</title>
<script src="js/mymodule.js"></script>
</head>
<body>
<script>
/* HOW TO USE myFunction from mymodule.js ??? */
/* Answer: */
mymodule.myFunction();
</script>
</body>
</html>