【问题标题】:Requirejs using shimRequirejs 使用 shim
【发布时间】:2023-12-26 14:27:01
【问题描述】:

通过 requirejs2 使用 shim,有办法告诉 requires 模块已经加载了吗?

例子:

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="undescrore.js"></script>
<script type="text/javascript" src="require.js'"></script>
<script type="text/javascript">
    require.config({
        paths: {
            "backbone": '/vendor/js/backbone-min.js'
        },
        shim: {
            'backbone': {
                //These script dependencies should be loaded before loading
                //backbone.js
                deps: ['underscore', 'jquery'], // here I would like to load the already loaded library
            }
        }
    });
</script>

【问题讨论】:

    标签: backbone.js requirejs


    【解决方案1】:

    好吧,如果下划线已经加载并且可用,则根本不需要 shim。 Backbone 将愉快地加载。如果没有,可能是因为下划线没有实际加载。

    只是部分使用 require.js 听起来是错误的,您不妨将它们全部加载到 AMD 中。为此,您需要像这样更改垫片:

    shim: {
        backbone: {
            deps: ["underscore", "jquery"],
            exports: "Backbone"
        },
    
        underscore: {
            exports: "_"
        }
    }
    

    当然还有更新你的paths

    【讨论】:

      【解决方案2】:

      我不确定您是否能够为您的用例找到最佳方法。 如果您真的 - 出于某种原因 - 需要添加其他脚本而不使用代码示例@js999 中的 RequireJS,那么您需要检查这些脚本的全局变量 (jQuery, _) 是否存在,然后将它们定义为模块.从您的代码示例来看,它看起来像这样:

      <script type="text/javascript" src="jquery.js"></script>
      <script type="text/javascript" src="undescrore.js"></script>
      <script type="text/javascript" src="require.js'"></script>
      <script type="text/javascript">
          // check for jQuery 
          if (window.jQuery) {
              define('jquery', [], function () {
                  return window.jQuery;
              });
          }
      
          // check for underscore
          if (window._) {
              define('underscore', [], function () {
                  return window._;
              });
          }
      
          require.config({
              paths: {
                  // remove the file extension (.js)          
                  "backbone": '/vendor/js/backbone-min'
              },
              shim: {
                  'backbone': {
                      deps: ['underscore', 'jquery']
                  }
              }
          });
      </script>
      

      【讨论】: