模块未定义

时间:2016-02-26 19:19:04

标签: javascript node.js requirejs

我正在学习Javascript和Node,我正在尝试创建一个扩展String的模块。首先我得到错误要求没有定义所以我开始使用requireJS。然后我收到此错误NS_ERROR_DOM_BAD_URI: Access to restricted URI denied,因此我将project.html移动到与.js文件相同的文件夹中。现在我得到require.js中未定义的模块,我似乎无法弄清楚原因。我已阅读其他一些帖子,但我找不到解决方案。我的文件结构如下所示

  
      
  • 条/      
        
    • 脚本/
    •   
    • main.js
    •   
    • require.js
    •   
    • project.html
    •   
    • 助手/      
          
      • extendString.js
      •   
    •   
  •   

main.js

define(function(require, exports, module){
  var StringHelperModule = require("helper/extendString.js");
  StringHelperModule.extendString(String);

  var tmp = 'Hello World'.strip(' ');
  document.write(tmp);
  //Outputs: HelloWorld
});

extendString.js

'use strict';
module.exports = function extendString(String){
  String.prototype.strip = function (delimiter) {
    return this.replace(delimiter, '');
  };
};

project.html

<!DOCTYPE html>
<html>
   <head>
      <script data-main='main' src='require.js'></script>
   </head>
</html>

require.js

(function () {
    // Separate function to avoid eval pollution, same with arguments use.
    function exec() {
        eval(arguments[0]); //This is line the error points to
    }

    require.load = function (context, moduleName, url) {
        var xhr = new XMLHttpRequest();

        xhr.open('GET', url, true);
        xhr.send();

        xhr.onreadystatechange = function () {
            if (xhr.readyState === 4) {
                exec(xhr.responseText);

                //Support anonymous modules.
                context.completeLoad(moduleName);
            }
        };
    };
}());

如果模块没有定义,如果与此有任何关系

,我也会变得格式不正确

1 个答案:

答案 0 :(得分:1)

我认为你在这里混合模块格式,你的模块看起来更像是CommonJS,而不是AMD格式。

define(function(require, exports, module) {
  'use strict';

  module.exports = function extendString () {
    String.prototype.strip = function (delimiter) {
      return this.replace(delimiter, '');
    };
  };
});

然后,在main.js中,您应该使用require()而不是define()。 另外,请注意,您不需要将String传递给函数,它是全局的。

require(
  ['path/to/extendString'],
    function (extendString) {
      extendString(); // add the methods to String.prototype
      console.log('Hello awesome world!'.strip(' '));
    }
);

这应该有效。