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 구문과 일반 콜백 구문과 관련이 있습니다.
- http://requirejs.org/docs/whyamd.html#commonjscompat
- https://github.com/jrburke/requirejs/wiki/Differences-between-the-simplified-CommonJS-wrapper-and-standard-AMD-define
모듈을로드하는 것은 알 수없는 다운로드 타이밍으로 인해 본질적으로 비동기 프로세스입니다. 그러나 서버 측 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...
});
});
'developer tip' 카테고리의 다른 글
Android에서 로그인 화면 / 활동을 만드는 올바른 방법은 무엇입니까? (0) | 2020.12.31 |
---|---|
쉬운 배포 및 업데이트를위한 Node.js 설정 (0) | 2020.12.31 |
abs (double)에 대한 모호한 오버로드 호출 (0) | 2020.12.30 |
C의 main () 함수에 대한 유효한 서명은 무엇입니까? (0) | 2020.12.30 |
C ++에서 클래스 상속 방지 (0) | 2020.12.30 |