理解和解决requireJS的报错:MODULE NAME HAS NOT BEEN LOADED YET FOR CONTEXT

使用requireJS加载模块的时候,有时候会碰到如下的错误:

Uncaught Error: Module name "module1" has not been loaded yet for context: _. Use require([])

比如下面的代码就会报这个错误:

require([], function() {

	var module = require("module1");
	alert(module.name);
});

这个错误在requireJS官网上写的很明白:

This occurs when there is a require(‘name‘) call, but the ‘name‘ module has not been loaded yet.

我们先来看下,requireJS中定义模块和加载模块的标准方式:

// 加载模块的标准方式
require(['foo','jquery'], function (foo,$) {
    //foo is now loaded.
});

// 定义模块的标准方式
define(['module1', 'module2'], function(m1, m2) {

    return {
        method: function() {
            m1.methodA();
            m2.methodB();
        }
    };

});

如果我们需要加载的或者定义的模块比较少,这种标准的写法是很清晰的。

但是如果我们需要加载的模块很多,那么这种一一对应的写法很繁琐。

define(
    ['dep1', 'dep2', 'dep3', 'dep4', 'dep5', 'dep6', 'dep7', 'dep8'],
    function(dep1, dep2, dep3, dep4, dep5, dep6, dep7, dep8){
        ...
    }
);

为了解决这个问题,我们可以使用以下2种方式来定义模块:

方式1:If you are using the simplified define wrapper, make sure you have require as
the first argument to the definition function

define(
    function (require) {
        var dep1 = require('dep1'),
            dep2 = require('dep2'),
            dep3 = require('dep3'),
            dep4 = require('dep4'),
            dep5 = require('dep5'),
            dep6 = require('dep6'),
            dep7 = require('dep7'),
            dep8 = require('dep8');
    }
});

方式2:If you are listing dependencies in the dependency array, make sure that require and name are
in the dependency array

define(['require', 'dep1', 'dep2', 'dep3', 'dep4', 'dep5'], function (require) {
    var dep1 = require('dep1');
    var dep2 = require('dep2');
});

但是下面的这种写法就不行,会报错HAS NOT BEEN LOADED YET FOR CONTEXT

//THIS WILL FAIL
define(['require'], function (require) {
    var namedModule = require('name');
});

官网上的解释是:

This fails because requirejs needs to be sure to load and execute all dependencies before calling the factory function above. If
a dependency array is given to define(), then requirejs assumes that all dependencies are listed in that array, and it will not scan the factory function
for other dependencies. So, either do not pass in the dependency array, or if using the dependency array, list all the dependencies in it.

最后官网上特别强调:require(‘name‘)这种写法,只应该出现在define()或者require()的回调函数中。

Be sure that require(‘name‘) only
occurs inside a define() definition function or a require() callback function, never in the global space by its own.

可以看到使用define()定义模块的时候,如果依赖的模块比较少,那么可以使用标准方式;如果依赖的模块很多,那么可以使用方式1或者方式2来解决。很显然,使用require()加载模块的时候,也存在和define()一样的问题。经过我的试验:使用方式2也是可以的。

方式3:使用require加载多个模块的时候

//异步加载module1模块,加载完成后调用回调函数
require(["module3","module1","module2"], function() {

	var m1 = require("module1");
	alert(m1.name);
});

总结:使用define()定义模块,使用require()加载模块,可以使用标准方式,或者是方式1,方式2,方式3,这样就能够实现requireJS中模块的正确加载和定义。

时间: 2024-10-12 23:32:03

理解和解决requireJS的报错:MODULE NAME HAS NOT BEEN LOADED YET FOR CONTEXT的相关文章

VS Code报错Module 'xx' has no 'xx' member pylint(no-member)解决办法

pylint是vscode的python语法检查器,pylint是静态检查,在用第三方库的时候有些成员只有在运行代码的时候才会被建立,它就找不到成员,在设置(settings.json)里添加 "python.linting.pylintArgs": ["--generate-members"]来避免报错 VS Code报错Module 'xx' has no 'xx' member pylint(no-member)解决办法 原文地址:https://www.cn

CentOS 安装paramiko 运行报错 'module' object has no attribute 'GSSException'

网上的解决办法都是: ssh_gss.py,53,54行改成: 53 import gssapi.error 54 GSS_EXCEPTIONS = (gssapi.error.GSSException,) 但是从可移植性的角度来说这么改肯定是下下策. 其实是缺少个依赖包,命令行 : yum install python-paramiko 安装完成后问题解决 CentOS 安装paramiko 运行报错 'module' object has no attribute 'GSSException

解决mysqldump备份报错: Couldn't execute 'SHOW FIELDS FROM Unknown error 1356

服务器环境: [[email protected] mysql]# cat /etc/redhat-releaseCentOS Linux release 7.3.1611 (Core) [[email protected] mysql]# uname -aLinux localhost.localdomain 3.10.0-514.21.1.el7.x86_64 #1 SMP Thu May 25 17:04:51 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

vue报错 Module not found: Error: Cannot resolve 'file' or 'directory'

炸了,我好写sell而组件,直接就用了,我的天哪 看你的写了吗,就用: Module not found: Error: Cannot resolve 'file' or 'directory' 页另一种错误,按这种情况我没遇到:http://www.mamicode.com/info-detail-1564042.html vue报错 Module not found: Error: Cannot resolve 'file' or 'directory'

解决JVM启动报错:Unrecognized VM option '+HeapDumpOnOutOfMemeryError'

今天再搞一些OutOfMemery的相关知识探索,我想在JVM遇到OOM错误的时候,能够打印出heap dump,以便事后用Eclipse Memory Analyzer Tool(MAT)等内存分析工具分析内存的占用情况.我使用了JDK1.6.0_37和JDK1.7.0_60版本进行试验,到网上找了下,知道-XX:+HeapDumpOnOutOfMemoryError可以让JVM在探测到内存OOM的时候打印dump.但是在JVM启动参数添加这个参数的时候,JVM启动失败: Unrecogniz

修改grub解决计算机启动报错:ERROR 17

修改grub解决计算机启动报错:ERROR 17 原本计算机有C,D,E,F,G.C盘windows系统盘,G盘安装了Centos.后来由于需要,就压缩卷的方式从D盘压缩出一个H盘.然后再次启动计算机的时候就遇到了错误:ERROR 17 原因: 就在于先安装windows后安装Linux这样的话,grub就由位于G盘的Centos引导,现在该分区之前又划分出一个新的逻辑分区,就导致磁盘系统符号向后移了一位,因此grub失败. 解决方案: 1,刻录一个Linux安装U盘,进入BIOS修改启动项,从

vue.js报错:Module build failed: Error: No parser and no file path given, couldn't infer a parser.

ERROR Failed to compile with 2 errors 12:00:33 error in ./src/App.vue Module build failed: Error: No parser and no file path given, couldn't infer a parser. at normalize (C:\Users\admin\Desktop\222\demo\node_modules\prettier\index.js:7051:13) at form

解决MySQL8.0报错:Unknown system variable 'validate_password_policy'

一.问题描述 1.在安装MySQL8.0时,修改临时密码,因密码过于简单(如:123456),不符合MySQL密码规范,会触发一个报错信息: ERROR 1819 (HY000): Your password does not satisfy the current policy requirements. 二.遇到问题 1.解决办法调整MySQL密码验证规则,修改 policy 和 length 的值. 2.MySQL 5.7 进行如下设置,即可解决问题: mysql>  set global

自定义View的ToolBar布局报错Error:(2) No resource identifier found for attribute 'context' in package 'c

这是由于你的自定义xmlns出错, 先上代码: 出错的布局文件 <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/apk/res-auto" android:id="@+id/drawer_layout" andro