<script>标记上的data-main属性,无法加载require.js

时间:2015-11-13 15:07:50

标签: javascript requirejs

我做了一些意外发现,我能够将我的data-main js文件加载到一个没有加载requireJS

&#xA;&#xA;
 &lt; script type =“text / javascript”src =“requirejs.config.js”data-main =“theme.js”&gt;&lt; / script&gt;&#xA;&lt; script type =“text / javascript”src =“ requirejs.js“&gt;&lt; / script&gt;&#xA;  
&#xA;&#xA;

它完美地加载了我的theme.js文件

&#xA ;&#xA;

这是requirejs的故意特征吗?还是一个bug?

&#xA;&#xA;

我希望这不是一个bug。

&#xA;&#xA;

我的requirejs.config的内容.js低于

&#xA;&#xA;
  var require = {&#xA; baseUrl:'/ js /',&#xA;路径:{&#xA; 'jquery':“lib / jquery / jquery”,&#xA; 'bootstrap':“lib / bootstrap / js / bootstrap”&#xA; },&#XA;垫片:{&#xA; 'bootstrap':['jquery']&#xA; },&#XA;地图:{&#xA; '*':{&#xA; 'jquery':'jQueryNoConflict'&#xA; },&#XA; 'jQueryNoConflict':{&#xA; 'jquery':'jquery'&#xA; }&#XA; }&#xA;}&#xA;  
&#xA;&#xA;

我在这里查看每个样本,看起来他们没有做我意外发现的事情。

& #xA;&#xA;

http://requirejs.org/docs/api html的#数据主要

&#XA;

2 个答案:

答案 0 :(得分:1)

我已经能够使用RequireJS 2.1.20重现您的报告行为。您可以看到here执行检查的代码:

NA

if (isBrowser && !cfg.skipDataMain) { //Figure out baseUrl. Get it from the script tag with require.js in it. eachReverse(scripts(), function (script) { 循环以相反的顺序查看所有eachReverse个元素。由于DOM的工作方式,只有在HTML中加载RequireJS的script元素和之前的元素才会循环播放,因为HTML仍处于被解析过程中此代码执行时的浏览器。 (因此,加载RequireJS的元素之后的script元素的DOM节点尚不存在。)循环中的函数搜索,直到它遇到script元素script 。它可能是加载RequireJS的那个,也可能是之前的任何一个。

我不知道是否认为这是一个带有意外副作用的错误或功能。有人可能想要更改逻辑以检查data-main元素src属性是否指向包含RequireJS的文件。然而,在我看来,这将是脆弱的。 (它不能只是一个简单的文件名比较,因为如果您决定更改文件名,代码将会中断。)

答案 1 :(得分:0)

您的data-main位于错误的脚本标记

<script type="text/javascript" src="requirejs.config.js"></script>
<script type="text/javascript" src="requirejs.js" data-main="theme"></script>

此外,您不需要.js

根据require.js docs

<!--when require.js loads it will inject another script tag
    (with async attribute) for scripts/main.js-->
<script data-main="scripts/main" src="scripts/require.js"></script>

修改

Applogies ......我误解了这个问题。

我只是快速浏览了requirejs源代码,其原因在于它找到了所有script元素(document.getElementsByTagName('script');)并迭代它们以找到data-main属性。实际上理论上你可以使用data-main定义多个脚本,并且它将加载所有脚本。