Javascript 如何在Require.js优化期间使用本地文件,但在运行时使用CDN托管版本?

Javascript 如何在Require.js优化期间使用本地文件,但在运行时使用CDN托管版本?,javascript,requirejs,amd,r.js,ractivejs,Javascript,Requirejs,Amd,R.js,Ractivejs,我的页面包括几个作为独立AMD模块存在的组件。每个组件都由Require.js Optimizer转换为单个文件。因为这些组件中有几个共享依赖项(例如jQuery和d3),Optimizerpathconfig使用CDN URL作为这些依赖项,而不是将它们捆绑到优化文件中 这就是它变得棘手的地方。我已经编写了一个名为rvc.js的for,它允许我包含在HTML文件中定义的抽象组件。(是的,我正在寻求关于如何使用我自己的图书馆的帮助。) 这很好用-像这样的代码会像您期望的那样得到优化: defin

我的页面包括几个作为独立AMD模块存在的组件。每个组件都由Require.js Optimizer转换为单个文件。因为这些组件中有几个共享依赖项(例如jQuery和d3),Optimizer
path
config使用CDN URL作为这些依赖项,而不是将它们捆绑到优化文件中

这就是它变得棘手的地方。我已经编写了一个名为rvc.js的for,它允许我包含在HTML文件中定义的抽象组件。(是的,我正在寻求关于如何使用我自己的图书馆的帮助。)

这很好用-像这样的代码会像您期望的那样得到优化:

define( function ( require ) {
  var ChartView = require( 'rvc!views/Chart' );
  var view = new ChartView({ el: 'chart' });
});
因为有几个组件使用了Ractive,所以应该从jQuery和d3这样的CDN提供服务。但是rvc.js在优化过程中使用它,这意味着优化程序的
路径
配置的
Ractive
条目不能指向CDN-它必须指向本地文件


有没有办法告诉Require.js“在优化过程中使用本地文件,但在运行时从CDN加载”?

因此我最终确定了一个解决方案。它感觉有点笨拙,但它可以工作:

  • 将你不想捆绑的加载程序和库清除掉
  • 添加一个
    onBuildWrite
    函数,该函数根据库重写模块,以便他们认为他们需要完全其他的东西-在本例中是
    Ractive\u RUNTIME
  • 向运行时AMD配置的
    路径
    对象添加一个条目,以便
    Ractive\u运行时
    指向CDN
  • 我的Optimizer配置现在如下所示:

    {
      baseUrl: 'path/to/js/',
      out: 'build/js/app.js',
      name: 'app',
      optimize: 'none',
    
      paths: {
        'amd-loader': 'loaders/amd-loader',
        'rvc': 'loaders/rvc',
        'Ractive': 'lib/Ractive'
      },
    
      stubModules: [ 'amd-loader', 'rvc', 'Ractive' ],
    
      onBuildWrite: function ( name, path, contents ) {
        if ( contents === "define('Ractive',{});" ) {
          // this is the stub module, we can kill it
          return '';
        }
    
        // otherwise all references to `Ractive` need replacing
        return contents.replace( /['"]Ractive['"]/g, '"Ractive_RUNTIME"' );
      }
    }
    
    同时,加载Optimizer创建的app.js文件的脚本有一个指向CDN的配置条目:

    require.config({
      context: uniqueContext,
      baseUrl: baseUrl,
    
      paths: {
        'amd-loader': 'loaders/amd-loader',
        'rvc': 'loaders/rvc',
        'Ractive': 'lib/Ractive',
        'Ractive_RUNTIME': 'http://cdn.ractivejs.org/releases/0.3.9/Ractive.min'
      }
    });
    

    设置一个变量,比如fileToUse=amILocal()?“lib.js”:“lib.min.js”;并将fileToUse传递给require,而不是硬编码的文本。问题在于,无论将
    fileToUse
    的哪个值提供给优化程序,这都是a)优化过程中使用的文件,以及b)优化程序在构建中包括(或尝试)的文件。因此,如果
    filetuse
    是本地文件,则rvc.js在优化过程中使用本地文件,但它也会被捆绑;如果是远程的,则优化失败。