require.js 사용 삽질기 (Windows는 왜 path에 대소문자를 구분하지 않는가…)

Title
Why Your Routine is Killing Your Potential
Date
Jul 15, 2017
linux에서와는 달리 windows에서는 path에서 대소문자를 구분하지 않는다. (대체 왜????)
이 차이가 require.js 사용시 오류를 발생시킬 수 있는데, 스스로의 추후 삽질을 방지하고자 정리해보았다.
예들들어, 아래와 같이 Singleton instance 를 반환하는 모듈을 정의했다고 하자.
views/appView.js
1. define([], function () { 2. var AppView = View.extend({ ... }); 3. return new AppView(); 4. });
require.js 는 기본적으로 어떤 모듈이 define의 의존성이나 require 함수에 의해 최초에 로드될때 대략 아래와 같은 과정을 거친다.
  • 해당 경로의 js를 로드한다.
  • 이때, 해당 js 내에 define호출에 의해 모듈 정의를 위한 함수가 실행됨.
  • 해당 함수의 반환값은 캐싱해놓고 반환값을 해당 모듈을 요청한 모듈에 반환.
여기서 캐싱은 모듈의 이름 (별도로 지정했을 경우) 또는 모듈의 경로와 함께 캐싱되는데,
따라서, js에 선언된 모듈이 다른 경로명으로 요청된다면 실제로는 모듈 정의 함수가 각각 불리워지고 캐싱도 각각 이루어진다.
아래와 같이 위의 appView 에 의존성을 가지는 두 개 이상의 다른 모듈에서 views/appView와 views/AppView 처럼 대소문자를 다르게 쓴다면,
define(['views/MyView', 'views/appView'], function (MyView, appView) { appView.$el.append((new MyView()).render().$el); }); ... define(['views/MyView', 'views/AppView'], function (MyView, AppView) { appView });
두 모듈에서 각각 취하고 있는 appView와 AppView는 의도와는 달리 다른 instance가 된다.
Windows에서 대소문자 구분을 했더라면, 참조 에러가 나서 미리 알았겠지…
 
Window에서 개발하고 Linux에서 돌렸더니 다른 결과가 나타나서 당황하였음=ㅅ=