RequireJS:有没有办法实现多种基本URL?(RequireJS: Is there a wa

2019-06-27 22:42发布

我想用一个单独的域作为一个JavaScript框架,它会创建一个基本的要求配置,我可以从应用程序增加。

foo.example.com
    main.js
    lib/foo-specific.js
framework.example.com
    framework.js <-- entry point
    lib/jquery.js
    lib/etc...

理想情况下,我希望能够要求“的lib / foo的特定”和/或“的lib / jQuery的”,并有路径只是很好地解决,但我学到了什么,有没有办法做到这一点,除非我用一个特定的路径键/值在每一个框架js文件。 目前,我有一个自定义插件具有不同的基本URL来加载指定的路径(例如fw!lib/jquery ),但如果我想使用text! 插件,它不会工作作为插件链接不受支持。

见https://github.com/jpillora/js-framework什么我目前得到的,也https://github.com/jpillora/prettyprinter的使用情况。

有没有办法解决这个问题一个干净的方式? 或实现多个基站网址?

注:我也看了成多个要求的情况下,虽然我不认为这工作,因为我想在应用程序能够访问到框架中的配置。

Answer 1:

由詹姆斯·伯克RequireJS Github上发行的页面上回答: 问题#447:多个基本URL·jrburke / requirejs 。

真可谓是相当简单的,如果数据主要是唯一的入口点脚本(更多信息评论),我解决我的具体问题有以下几点:

我的应用程序的index.html

<script src="http://framework.jpillora.com/js/lib/require.js" 
  data-main="http://framework.jpillora.com/js/framework" > </script>

有requirejs入口点设置为framework.js

var framework = ... //set using script elements src attribute

require.config({

    baseUrl: 'js/',

    //Framework paths
    paths: {
      'framework': framework,
      'lib'      : framework + 'js/lib',
      'ext'      : framework + 'js/ext',
      'util'     : framework + 'js/util'
    },

    //Shortcuts
    map: {
      '*': {
        ...
      }
    },

    //Non-modularised libraries with deps
    shim: {
      ...
    }
});

require(['main']);

因此,而不是通常做index.html->main.js ,我们增加一个额外的步骤index.html->framework.js->main.js ,这给路径的应用程序代码的知识框架代码。

例如,在应用http://prettyprint.jpillora.com/ ,一旦需要加载framework.js ,它会安装路径lib/...其中http://framework.jpillora.com/并设置baseUrl./js/所以一旦main是必需的,这将有基本URL设置为它自己的域名和lib指向另一个域。

这导致require(['lib/foo', 'view/bar']); 解析为:

http://framework.jpillora.com/js/lib/foo.jshttp://prettyprint.jpillora.com/js/view/bar.js

由于此处显示的应用程序仅仅是一个main.js一切来自于framework

所以最后,每当我加载应用程序的main.js通过上述framework.js ,我则有机会获得我所有的常用库和工具类。 见附录源。

还要注意,与r.js优化器和一个不错的本地文件结构,还可以优化应用到一个单一的js文件只什么需要从拉framework



Answer 2:

问题

而试图建立一个测试环境我有一个类似的问题。 我有过这样的文件结构:

myApp/
    src/
        js/
            app.js
            data.js
            lib/underscore.js
    test/
        karma.conf.js
        test-main.js
        matchers.js
        spec/
            data.js

这里的地方变得棘手:我的应用程序的脚本( app.jsdata.js )承担RequireJS配置解析datasrc/js/data.jslib/underscoresrc/js/lib/underscore.js等,所以我需要在我的测试环境,配置以及:

test/test-main.js
-----------------
require.config({
  // Karma serves files under /base, which is the basePath from your config file
  baseUrl: '/base/src/js',
  // ...
});

现在,我可以写我的测试:

test/spec/data.js
-----------------
define(['data', '../../test/matchers'], function(dataModule) {
    describe('The data module', function() {
        it('should satisfy my custom matcher', function() {
            expect(dataModule).toSatisfyMyCustomMatcher();
        });
    });
});

随着一些自定义的匹配:

test/matchers.js
----------------
define([], function() {
    beforeEach(function() {
        this.addMatchers({
            toSatisfyMyCustomMatcher: function() {
                return this.actual.isGood;
            },
        });
    });
});

然而, '../../test/matchers'部分窘况丑陋。 测试规范不应该知道文件路径与其他模块的困扰 - 这是RequireJS的工作。 相反,我们要使用符号名称。

解决方案

该RequireJS 路径配置也可以映射目录。

被用于模块名称不应包含扩展,由于路径映射可能是一个目录的路径。

因此,该解决方案是一个简单的路径配置:

test/test-main.js
-----------------
require.config({
  baseUrl: '/base/src/js',
  paths: {
      test: '../../test',
  },
  // ...
});

现在我可以参考test目录就好像它是一个孩子baseUrl

test/spec/data.js
-----------------
define(['data', 'test/matchers'], function(dataModule) {
    // ...
});

这在我的情况下,有效地出来几乎是一样的,如果我能有多重baseUrl秒。



Answer 3:

看看我们是如何处理路由,然后在上下文BoilerplateJS这对于大规模的产品开发参考架构。 我们使用的库crossroads.js路由模块和UI组件。 所有有做的路径是/哈希添加到路由集合,它会通过框架进行路由。

作为一个示例 UI组件的所有路径被添加到URL控制器对象。

作为访问整个应用程序框架的配置信息,配置/设置可以连接到其可以在应用程序内访问的全局上下文对象。



文章来源: RequireJS: Is there a way to achieve multiple base URLs?