25

基本的に、クライアント側でも使用できる便利な JS であるノード モジュールを作成しました。require.js が common.js コンポーネントをロードできることは知っていますが、モジュールのクライアント側を使用するすべての人が require または common.js などを必要とすることを必ずしも義務付けたくはありません。module.exports = ...また、ファイルの下部にあるを強制的に削除したくありません。他の人はこの問題をどのように解決しますか? 2 つのバージョンを作成するだけですか、それとも 2 つの「コンパイル済み」バージョンを作成するだけですか? module.exports はどこでも機能しますか?

4

3 に答える 3

22

これは underscore.js が行うことです:

if (typeof exports !== 'undefined') {
  if (typeof module !== 'undefined' && module.exports) {
    exports = module.exports = _;
  }
  exports._ = _;
} else {
  root['_'] = _;
}
于 2012-09-24T19:42:44.543 に答える
13

この答えは、割り当てが右から左に評価されるという事実に依存しています。MyModuleexports最初に割り当てられ、次にexportsが割り当てられmodule.exportsます。

が宣言されていない場合module、例外がスローされます。

短く、クリーンで、覚えやすい:

try {
   module.exports = exports = MyModule;
} catch (e) {}

このファイルは、ブラウザと node.js の両方に含めることができます。

于 2017-08-15T11:12:27.380 に答える
4

これは私にとってはうまくいきました(CoffeeScript)。window「名前空間」がクライアントのスコープで主張したいものであると仮定します

(module ? {}).exports = @Namespace =
  my: 'cool'
  module: '!'

require('namespace').my === 'cool'その後、Node.js またはNamespace.my === 'cool'ブラウザーで使用できます。これはJSに次のように変換されます

(typeof module !== "undefined" && module !== null ? module : {}).exports = this.Namespace = {
  my: 'cool',
  module: '!'
};
于 2012-09-24T19:55:23.770 に答える