나는 RequireJS jQuery Docs뿐만 아니라 RequireJS를 사용하기 시작하기 위해 this question을 따라갔습니다. 단일 파일에서 패키지를 재사용하는 방법이나 파일 자체를 구조화하는 방법을 찾지 못했습니다. 다음 코드는 예상대로 작동하고 페이지에 텍스트를 표시합니다. javascript의 첫 부분은 자동으로 see this question for more details으로 생성됩니다.AMD 사양을 준수하기 위해 JavaScript를 올바르게 작성합니까?
내가 관심을 갖는 부분은 AMDSpecs.js init 메소드입니다. 이것은 AMD 스펙에 비생산적인 것으로 보인다. 이 경우 jQuery가 필요할 때마다 require를 호출해야합니까? 제가 의미하는 바를 설명하고 싶습니다. 더 많은 정보가 필요한지 물어보십시오.
HTML
<div id="output"></div>
자바 스크립트
<script src="/MVCTesting/Scripts/ThirdParty/RequireJS/require.js"></script>
<script type="text/javascript">
require([ "/MVCTesting/Scripts/AMD/core.js" ], function() {
require(["jquery", "/MVCTesting/Scripts/AMD/views/jquery/AMDSpecs.js"],
function($, pm) {
if (pm != undefined && pm.init) {
pm.init($);
}
});
});
</script>
/*AMDSpecs.js*/
define(function() {
//Do setup work here
return {
$: undefined,
setupEvents: function() {
$("#output").text("jQuery is working!");
},
init: function ($) {
this.$ = $;
require(["Views/JQuery/AMDSpecs"], function (specs) {
specs.setupEvents();
});
}
};
});
UPDATE
여기에 모든 코드와 도널드의 대답 후 내 작업 솔루션입니다. 참고로 모듈 이름에 .js를 포함해야하지만 프로세스가 훨씬 단순 해집니다.
HtmlExtension.cs
/// <summary>
/// An Html helper for Require.js
/// </summary>
/// <param name="helper"></param>
/// <param name="module">Location of the main.js file.</param>
/// <returns></returns>
public static MvcHtmlString RequireJS(this HtmlHelper helper, string module)
{
const string jsLocation = "Scripts/AMD/";
//Don't build require string if there is not an amd script
if (!File.Exists(helper.ViewContext.HttpContext.Server.MapPath(
GetAbsolutePath(Path.Combine(jsLocation, module + ".js")))))
{
return null;
}
var require = new StringBuilder();
require.AppendLine(" require([\"" + GetAbsolutePath(jsLocation + module + ".js") + "\"], function(pm) {");
require.AppendLine(" if (pm != undefined && pm.init) {");
require.AppendLine(" pm.init();");
require.AppendLine(" }");
require.AppendLine(" });");
return new MvcHtmlString(require.ToString());
}
/// <summary>
/// Convert the path to work in IIS for MVC
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
private static string GetAbsolutePath(string path)
{
return VirtualPathUtility.ToAbsolute("~/" + path);
}
/// <summary>
/// Create the include for RequireJS based on the current page
/// </summary>
/// <param name="helper"></param>
/// <returns></returns>
public static MvcHtmlString ViewSpecificRequireJS(this HtmlHelper helper)
{
var action = helper.ViewContext.RouteData.Values["action"];
var controller = helper.ViewContext.RouteData.Values["controller"];
return helper.RequireJS(string.Format("views/{0}/{1}", controller, action));
}
_Layout.cshtml (MVCTesting이 내 프로젝트 이름)
<script data-main="/MVCTesting/Scripts/AMD/core.js" src="~/Scripts/ThirdParty/RequireJS/require.js"></script>
AMDSpecs.js
define(["jquery"], function ($) {
//Do setup work here
return {
setupEvents: function() {
$("#output").text("jQuery is working!");
},
init: function() {
this.setupEvents();
}
};
});
[Ahh, lightbulb] (http://savorthesweetlife.files.wordpress.com/2012/07/lightbulb1-despicableme.jpg). 그것은 AMDSpecs에서 훨씬 더 의미가 있습니다. 나는 또한 데이터 메인을 추가 할 것이고, 나는 한 페이지 셋업으로 그렇게했다. 그리고 그것은 잘 작동했다, 나는 [이 블로그를] 따랐다. (http://www.novanet.no/no/blog/yngve-bakken-nilsen/dates/2013/6/making-requirejs-play-nice-with-aspnet-mvc /)를 사용하여 MVC와 함께 작동하게하십시오. 그것이 틀렸다는 것을 말하는 것은 아닙니다;). – JabberwockyDecompiler
내 업데이트에서 .js를 추가해야한다고 언급했습니다. 나는 api에서이 절을 발견했다. 'RequireJS는 또한 기본적으로 모든 의존성이 스크립트라고 가정하기 때문에 모듈 ID에 후행 ".js"접미사가 없기를 기대합니다. RequireJS는 모듈 ID를 경로로 변환 할 때 자동으로 추가 할 것입니다. '이것이 확실히 당신이해야 할 말이며, 처음에는 매우 혼란 스러웠습니다. 싱글 페이지에서 나는 그렇게해야만한다. 그러나 MVC와 함께 확장 기능을 추가해야했습니다. – JabberwockyDecompiler
".js"확장자를 지정해야합니다. 그것은 초기에 나를위한 함정이었습니다. 왜냐하면 제가 포함 시키면 스크립트가로드되지 않기 때문입니다. –