1. 程式人生 > >理解和解決requireJS的報錯:MODULE NAME HAS NOT BEEN LOADED YET FOR CONTEXT

理解和解決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中模組的正確載入和定義。

相關推薦

理解解決requireJS:MODULE NAME HAS NOT BEEN LOADED YET FOR CONTEXT

使用requireJS載入模組的時候,有時候會碰到如下的錯誤: Uncaught Error: Module name "module1" has not been loaded yet for co

解決myeclipseEntity manager has not been injected (is the Spring Aspects JAR configured as an AJC/AJ

本篇文章是一種常規的解決方式,對於新手,以做參考,順便記錄成長曆程。 報錯的全部資訊為:Entity manager has not been injected (is the Spring Aspects JAR configured as an AJC/AJDT aspects library

Unity:The variable ... has not been assigned.

Unity報錯:The variable prg of Rg02 has not been assigned. The variable prg of Rg02 has not been assigned. using System.Collections; using System.Col

git:Git fetchgit pull的區別, 解決Git:error: You have not concluded your merge (MERGE_HEAD exists).

pre ret mas -h ruby error you origin 分支 Git fetch和git pull的區別, 解決Git報錯:error: You have not concluded your merge (MERGE_HEAD exists). 解決

IDA執行加密演算法識別外掛findcrypt-yaramodule’ object has no attribute’set_name’

10月12日 findcrypt下載的是github專案, 負責人似乎沒維護好,指令碼原始碼findcrypt3.py裡的195行出錯 idc.set_name(value[0], name

轉載:解決Navicat :1130-host ... is not allowed to connect to this MySql server,MySQL不允許從遠端訪問的方法

1.改表法。 可能是你的帳號不允許從遠端登陸,只能在localhost。這個時候只要在localhost的那臺電腦,登入mysql後,更改 “mysql” 資料庫裡的 “user” 表裡的 “host” 項,從"localhost"改稱"%" mysql -u

解決Navicat :1130-host ... is not allowed to connect to this MySql server,MySQL不允許從遠端訪問的方法 .

解決方法:1。 改表法。可能是你的帳號不允許從遠端登陸,只能在localhost。這個時候只要在localhost的那臺電腦,登入mysql後,更改 "mysql" 資料庫裡的 "user" 表裡的 "host" 項,從"localhost"改稱"%"mysql -u roo

解決Selenium:Element is not clickable at point (x, y). Other element would receive the click

用Python寫路由器控制指令碼的時候遇到這個問題,Selenium提示如下: Message: Element is not clickable at point (1191.5, 143). Other element would receive the click:

SVN 操作 “Previous operation has not finished; run 'cleanup' if it was interrupted“

重新 mage 數據庫管理 列表 產生 alt width not operation 今天在 通過 SVN 合並代碼的時候報了如下的錯誤 ”Previous operation has not finished; run ‘cleanup‘ if it was inter

eclipse啟動the catalog could not be loaded please ensure that you have network access and if needed have configured your network proxy

實例 等待 ces .cn access 分享圖片 clas 安裝包 nan 搜索關鍵詞不對在網上查了一圈沒找到合適的解決辦法 去看報錯的日誌文件 然並卵。不過下面有個config.ini,想著以前能用現在不能用,肯定是配置問題,打開該文件 轉載請註明出處http

SQLyog連線資料庫plugin caching_sha2_password could not be loaded

開啟cmd:mysql -uroot -p? 進入mysql依次執行下面語句 ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; #修改加密規則? ALTER U

spark-submit Initial job has not accepted any resources

錯誤原因是記憶體缺少資源如果是master使用yarn-client模式則會讀取conf/spark-env.sh中的配置。如果是master使用yarn-cluster模式則會讀取conf/spark-default.conf中的配置。我的虛擬機器記憶體只有1g,所以spa

Docker容器中SQLyog連線資料庫plugin caching_sha2_password could not be loaded

ERROR 2059 (HY000): Authentication plugin ‘caching_sha2_password’ cannot be loaded 問題: 連線Docker啟動的mysql出現:ERROR 2059 (HY000): Authentication plu

Android Cordova 載入html :deviceready has not fired after 5 seconds.

問題: 通過Cordova 載入html 頁面,在低版本手機上處理正常,但在高版本手機上出現異常(大概是Android 8.0 以上) 查明的原因大概是: 'deviceready has n

MacLinux: dyld: Library not loaded: /usr/local/opt/jpeg/lib/libjpeg.8.dylib的解決辦法

conf www. oca 谷歌 進行 rac dyld 終端 解決辦法 在mac系統下,執行谷歌機器學習框架 Tesseract時,報錯: dyld: Library not loaded: /usr/local/opt/jpeg/lib/libjpeg.8.dylib

不修改系統日期時間格式,解決Delphi提示 '****-**-**'is not a valid date and time

ali class ngs als ica 日期和時間 val 添加 ats 假如操作系統的日期格式不是yyyy-MM-dd格式,而是用strtodate(‘2014-10-01‘)) 來轉換的話,程序會提示爆粗 ‘****-**-**‘is not a valid dat

解決xcodeApp Store

解決xcode和App Store報錯 參考資料: Xcode 10 beta3 Error: Multiple commands produce [App Store提交稽核報錯 ERROR ITMS-90087解決辦法](App Store提交稽核報錯 ERRO

Android studio3 module not specified解決方案

說一下我的環境: Android Studio 3.2.1 Build #AI-181.5540.7.32.5056338, built on October 9, 2018 JRE: 1.8.0_152-release-1136-b06 amd64 JVM: OpenJDK 64-Bit

解決pythonImportError: No module named '_tkinter'

解決python報錯ImportError: No module named ‘_tkinter’ 報錯資訊:ImportError: No module named ‘_tkinter’, pleas

vueModule build failed: Error: No parser and no file path given, couldn't infer a parser.解決辦法

今天中午更新的專案,vue模組裡子模組報錯 百度查詢  今天下午1點多吧  貌似git 新版本給解決了   只需一步 更新即可 npm i [email protected]~1.12.0 這個是降版本 因為是更新成1.13.0崩的 不過官網