2017-01-26 4 views
2

같은 IIFE에서 실행하기 위해 2 개 이상의 개별 파일로 정의 된 자바 스크립트 코드가 있습니까? 나는 이것을 달성하기 위해 꿀꺽 꿀꺽 거리는 도구 같은 도구를 사용하는 것에 익숙하다.여러 파일에 걸친 IIFE

마치 평범한 문제처럼 보입니다. 내 코드를 정리하고 자체 파일 (분리 된 녹아웃 뷰 모델)로 분리하려고합니다. 그러나 나는 그들 모두가 같은 기능을 수행하고 지구를 오염시키지 않기를 바랍니다.

+0

물론입니다. 사용하려는 도구를 선택하는 것은 Stack Overflow의 범위를 벗어나므로 (의견을 기반으로 할 것임), 그렇습니다. 이렇게하려면 파일을 연결할 수 있습니다. 그 목적을 위해 녹아웃 그 자체 [이 조각들을 사용] (https://github.com/knockout/knockout/tree/master/build/fragments). –

+0

예! 나는이 파편들을 보았고 그것이 가능하다는 것을 알았다. 그리고 모든 파일을 함께 연결하고 IIFE (아마도 gulp-concat을 사용하여)로 묶는 것은 매우 사소한 것처럼 보입니다. 그러나 문제는 Chrome에서 발생합니다. 크롬의 개발 도구를 사용하여 코드를 즉시 변경할 수 있기를 원합니다. 생성 된 js 파일에서 작업하게되면 원본 파일을 수정할 수 있어야합니다. – smulz

답변

2

현대적인 방법은 모든 것을 IIFE에 넣는 대신 모듈을 사용하는 것입니다. 현재 모듈을 사용한다는 것은 RequireJS, SystemJS, Webpack, Browserify 등의 모듈 번들을 사용한다는 것을 의미합니다. 중기 적으로는 원하는 경우 브라우저에서 ES2015 + 모듈을 직접 사용할 수도 있고 또는 번들러를 다시 사용할 수도 있습니다. 그것들을 하나의 파일로 묶어 라. (당신은 바벨과 같은 transpilers과 ES2015 + 모듈 구문 오늘을 사용할 수 있지만, 당신은 여전히 ​​들러가 필요합니다.) 당신은 지금 RequireJS를 사용하지만 define 기능을 사용하지 않을 언급 한

. 일러스트레이션을 위해서 대략 모듈을 정의하는 방법 (저는 Require의 구문을 좋아하지 않지만 Babel을 사용하여 ES2015 구문을 추출 할 수 있습니다)

define("my-component", ["ko"], function(ko) { 
    // ...define the component... 

    // Return it 
    return MyComponent; 
}); 

그건 : KO로 구성 요소 정의 모듈

  1. 이 모듈이라고 말한다을 my-component (모듈 이름, 옵션 그래서 예를 들어 응용 프로그램의 최상위 모듈은을 가질 필요가 없다 이름)
  2. 모듈 (ko) (Knockout을 제공함)에 달려 있다고합니다.

    define(["my-component", "another-component"], function(MyComponent, AnotherComponent) { 
        // use MyComponent and AnotherComponent here 
    }); 
    
    : 그 의존성은 당신이 내 응용 프로그램에

그런 다음 모듈에 의해 정의 된 최상위 가지로 모듈을 MyComponent

  • 반환 값을 정의하는 데 사용하는 콜백에 대한 인수로 제공되는 방법을주의

    단순하게하기 위해 그룹에서 일반적으로 사용되는 다른 모듈을 그룹화하는 모듈을 사용할 수도 있습니다.

    my-component.js : ES2015 + 구문 대신에

    import ko from "./ko"; 
    // ...define MyComponent... 
    export default MyComponent; 
    

    app.js :

    import MyComponent from "./my-component"; 
    import AnotherComponent from "./another-component"; 
    
    // ...use them... 
    

    은 물론, 두 예제는 매우 간소화를하고 당신이 할 수있는 더 많은이있다.

  • +0

    고마워요! RequireJS를 사용하여 모든 파일을 가져옵니다. 나는 define() 함수를 사용하지 않고있다. 자바 스크립트 파일을 require()를 통해 브라우저로 가져 오기 위해서 순전히 그것을 사용하고있다. 나는이 파일들을 모두 IIFE로 가져 오기 위해 문서를 보았지만, 부족했다. – smulz

    +0

    @smulz : 죄송합니다. 나는 분명히해야합니다. 모든 것을 하나의 IIFE에 두지는 마십시오. 대신 모듈에서 물건을 정의하고 (전역을 작성하지 않음), RequireyS의 경우'require'와'define'을 사용하여 필요한 것을 원하는 모듈에서 다른 모듈로 가져옵니다. 이러한 번들에는 빌드시에 종속성 트리를 탐색하고 모든 종속성을 가진 단일 파일을 빌드하는 불필요한 전역을 작성하지 않는 도구가 있습니다. 예를 들어, IIFE로하는 일을하는 현대적인 방법은 모듈 * 대신 *을 사용하는 것입니다. –

    +0

    @smulz : 그래서 개발할 때, bundler는 개별적으로 파일을 가져 오는데, 이것은 개발하기에 편리합니다. 게시 준비가되면 builder를 실행하여 bundler의 종속성 트리 검사를 실행하고 파일을 하나의 산출물로 결합합니다. –

    0

    이것은 두 가지 개별적인 문제입니다.

    1. IIFE를 여러 파일로 확장 할 수 있습니까?
    2. 여러 파일에서 클래스/함수/etc를 전역 범위에 적용 할 수 있습니까? 예!

      FILE3

      이를 달성하기위한 방법 (101)이 존재하는 매우 단순한 예로서
      myNS.OtherViewModel = function() { ... } 
      

      myNS.MyViewModel = function(){ ... } 
      
      var myNS = {}; 
      

      파일 2 FILE1

    .

    +0

    예,이 문제에 대한 저의 원래 접근 방식이었습니다. 나는 모든 객체 인스턴스화에 "myNS"를 추가하기 위해 리팩터링하는 엄청난 양의 코드 때문에 엄청난 팬이 아니 었습니다. 나는 다른 선택권이 없다고 생각하기 시작했습니다. – smulz

    +0

    @smulz : 할일 : 모듈. –

    +0

    @smulz는 분명합니다. 이것은 구식 응답입니다. T.J. 현대 감각에서 훨씬 더 정확합니다. – Jamiec