developer tip

RequireJS에서 동적 요구 사항, "컨텍스트에 대한 모듈 이름이 아직로드되지 않았습니다"오류가 발생합니까?

optionbox 2020. 12. 31. 08:11
반응형

RequireJS에서 동적 요구 사항, "컨텍스트에 대한 모듈 이름이 아직로드되지 않았습니다"오류가 발생합니까?


RequireJS에서 다른 모듈을 "동적으로"로드하는 모듈을 정의하는 방법이 있습니까? 그렇다면 옵티 마이저 (r.js)가 모듈이 포함되어야하는 방법 /시기를 어떻게 이해합니까?

예를 들어, dynModules이름 / 경로 쌍을 정의하는 모듈을 사용하십시오.

define([], function () {
    return ['moduleA', 'moduleB']; // Array of module names
});

다른 모듈은 배열을 기반으로 동적으로 모듈을로드합니다. 이됩니다 작동하지 :

define(['dyn_modules'], function (dynModules) {
    for(name in dynModules) {   
        var module = require(path); // Call RequireJS require
    }

    // ...
});

... 제공합니다 :

포착되지 않은 오류 : 컨텍스트에 대해 모듈 이름 "moduleA"가 아직로드되지 않았습니다 : _. require ([]) http://requirejs.org/docs/errors.html#notloaded 사용

오류해결할있지만 더 이상 "동적"이 아닙니다.

define(['dyn_modules', 'moduleA', 'moduleB'], function (dynModules) {
    for(name in dynModules) {   
        var module = require(path); // Call RequireJS require
    }

    // ...
});

제한 사항은 단순화 된 CommonJS 구문과 일반 콜백 구문과 관련이 있습니다.

모듈을로드하는 것은 알 수없는 다운로드 타이밍으로 인해 본질적으로 비동기 프로세스입니다. 그러나 서버 측 CommonJS 사양의 에뮬레이션에서 RequireJS는 단순화 된 구문을 제공하려고합니다. 다음과 같이 할 때 :

var foomodule = require('foo');
// do something with fooModule

뒤에서 일어나는 일은 RequireJS가 함수 코드의 본문을보고 'foo'가 필요하다는 것을 파싱하고 함수 실행 전에로드한다는 것입니다. 그러나 변수 또는 귀하의 예와 같은 간단한 문자열이 아닌 다른 것 ...

var module = require(path); // Call RequireJS require

... Require는 이것을 구문 분석하고 자동으로 변환 할 수 없습니다. 해결책은 콜백 구문으로 변환하는 것입니다.

var moduleName = 'foo';
require([moduleName], function(fooModule){
    // do something with fooModule
})

위와 같이 표준 구문을 사용하기 위해 두 번째 예제를 다시 작성할 수 있습니다.

define(['dyn_modules'], function (dynModules) {
    require(dynModules, function(){
        // use arguments since you don't know how many modules you're getting in the callback
        for (var i = 0; i < arguments.length; i++){
            var mymodule = arguments[i];
            // do something with mymodule...
        }
    });

});

편집 : 자신의 대답에서 밑줄 / lodash를 사용 _.values하고 있으므로 _.object위와 같이 인수 배열을 통해 반복을 단순화 할 수 있습니다.


나 자신에게 대답합니다. RequireJS 웹 사이트에서 :

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

이는 requirejs가 위의 팩토리 함수를 호출하기 전에 모든 종속성을로드하고 실행해야하기 때문에 실패합니다. [...] 따라서 종속성 배열을 전달하지 않거나 종속성 배열을 사용하는 경우 모든 종속성을 나열하십시오.

내 솔루션 :

// Modules configuration (modules that will be used as Jade helpers)
define(function () {
    return {
        'moment':   'path/to/moment',
        'filesize': 'path/to/filesize',
        '_':        'path/to/lodash',
        '_s':       'path/to/underscore.string'
    };
});

로더 :

define(['jade', 'lodash', 'config'], function (Jade, _, Config) {
    var deps;

    // Dynamic require
    require(_.values(Config), function () {
        deps = _.object(_.keys(Config), arguments);

        // Use deps...
    });
});

참조 URL : https://stackoverflow.com/questions/17446844/dynamic-require-in-requirejs-getting-module-name-has-not-been-loaded-yet-for-c

반응형