11

アンダースコアがロードされたときにコードを実行する正しい方法は何ですか?以下のコードを実行して、モジュールで必要なときに_エクスポートされた名前空間を自動的に拡張しようとしています。

_.mixin(_.str.exports());

ドキュメントは少し曖昧ですが、私はそれをshim initセクションに置いたと思いますか?以下を試しましたが、initでヒットするブレークポイントを取得することさえできません。

require.config({
    paths: {
        jquery: 'libs/jquery/jquery.min',
        underscore: 'libs/underscore/lodash.min',
        underscorestring: 'libs/underscore/underscore.string.min'
    },

    shim: {
        underscore: {
            exports: '_'
        }
        underscorestring: {
            deps: ['underscore'],
            init: function (_) {
                //Mixin plugin to namespace
                _.mixin(_.str.exports());

                return _;
            }
        }
    }
});

これを実行してアンダースコア文字列を使用しようとすると、次のエラーが発生します。

Uncaught TypeError:オブジェクト関数s(e){return new o(e)}にはメソッド'startsWith'がありません

ドキュメント:

4

3 に答える 3

19

それが正しい方法かどうかはわかりませんが、アンダースコアがunderscore.stringに依存するように、物事を反転することで機能するようになりました。また、この方法では、underscore.stringを要求する必要はありません。

require.config({
  shim: {
    'backbone': {
      deps: ['underscore', 'jquery'],
      exports: 'Backbone'
    },
    'underscore': {
      deps: ['underscore.string'],
      exports: '_',
      init: function(UnderscoreString) {
        _.mixin(UnderscoreString);
      }
    }
  },
  paths: {
    'backbone'          : 'lib/backbone',
    'jquery'            : 'lib/jquery/jquery',
    'text'              : 'lib/require/text',
    'underscore'        : 'lib/underscore',
    'underscore.string' : 'lib/underscore.string'
  }
});

更新:2014年3月14日

Underscore.js v1.6.0はAMDとの互換性をinit()取り戻し、RequireJSから削除されたため、リファクタリングが必要です。Underscore.stringでアンダースコアをプリロードし続けるために、ミキサーモジュールを作成してそれらをまとめました。

新しいRequire.js構成

requirejs.config({
  paths: {
    'backbone'            : '../lib/backbone/backbone',
    'backbone.base'       : '../lib/backbone/backbone.base',
    'backbone.extensions' : '../lib/backbone/backbone.extensions',
    'jquery'              : '../lib/jquery/jquery',
    'text'                : '../lib/require/text',
    'underscore'          : '../lib/underscore/underscore',
    'underscore.mixed'    : '../lib/underscore/underscore.mixed',
    'underscore.string'   : '../lib/underscore/underscore.string'
  },
  shim: {
    'backbone.base': {
      deps: ['underscore.mixed', 'jquery'],
      exports: 'Backbone'
    },
  }
});

underscore.mixed

define([
  'underscore',
  'underscore.string'
], function(_, _s) {
  _.mixin(_s.exports());
  return _;
});

最後のステップは、モジュール定義内ののすべてのインスタンス'underscore'を置き換えることです。'underscore.mixed'この手順を回避するために、Underscoreをという名前のファイルに移動underscore.base.jsし、通常underscoreのミキサー(Backboneセットアップなど)を作成しようとしました。名前付きモジュールであるアンダースコアは、計画に同意しませんでした。

于 2013-03-09T05:48:39.383 に答える
3

どこかにアンダースコアストリングが必要ですか?必要がなければロードされないからです。私はあなたが投稿したのとほぼ同じコードでそれを動作させることができました:

require.config({
    paths: {
        underscore: [
            '//raw.github.com/documentcloud/underscore/master/underscore-min'
        ,   'lib/underscore'
        ]
    ,   underscorestring: 'https://raw.github.com/epeli/underscore.string/master/dist/underscore.string.min'
    }
,   shim: {
        underscore: { exports: '_' },
        underscorestring: {
            deps: ['underscore'],
            init: function(_) { 
                _.mixin(_.str.exports());
                return _; // guess, this is not needed.
            }
        }
    }
,   exclude: ['underscore']
});

require(['underscore', 'underscorestring'], function(_) {
    console.log( _.chars("i'm a happy string.") );
});
于 2012-12-04T14:36:56.350 に答える
0

私が間違っていたことを理解する前に、これと何時間も戦っています

これは私が間違ったことです

main.jsのファイルunderscore.stringの名前を変更しないでください

私のライブラリでは、パス内のファイルの名前を変更しましたが、名前を「underscore.string」に戻しました。

これはあなたのmain.jsがどのように見えるべきかです

require.config({
paths: {
    underscore: 'lib/underscore', 
    'underscore.string' : 'lib/_string' ,
},
shim: { 
    underscore: {
        exports: '_', 
        deps: [ 'jquery', 'jqueryui' ]
    }, 
    'underscore.string': { 
        deps: [ 'underscore' ]
    },
} 
....

次に、ミックスインファイルで行ったように、シムに依存関係として追加することができます

shim: { 
    mixin : {
        deps: [ 'jquery',  'underscore', 'underscore.string' , 'bootstrap'  ] 
    },  

または、次のように別のページで定義するだけです

/*global define */
define([    
    'underscore.string'
], function ( ) {   

_.strまたは_.stringからアクセスできるようになりました。

これが、この方法でそれを行うべきであり、他の名前を付けようとしない理由です。

underscore.string.jsの663行目

  // Register as a named module with AMD.
  if (typeof define === 'function' && define.amd)
    define('underscore.string', [], function(){ return _s; });

つまり、「underscore.string」を定義している場合にのみ、AMDに登録する必要がありますJS

ミックスインの場合、定義するだけで可能です

 /*global define */
define([     
    'underscore',
    'underscore.string'
], function ( ) {   
  _.mixin(_.str.exports());
于 2014-10-25T07:02:27.627 に答える