2017-04-03 3 views
0

다음과 같은 타이프 스크립트 .ts이 있습니다. 선행 입력 정의가 @types/typeahead에 있고 구현이 typeahead.js에 있기 때문에
내가 웹팩 버전 2.2.1webpack 2.2.1 잘못된 순서/위치로 종속성 정렬

import { module } from "angular"; 
import "typeahead"; 

class TypeAheadController { 
    static $inject = ["$log", "$timeout", "$http", "$interpolate"]; 
    constructor(
     public $log: ng.ILogService, 
     public $timeout: ng.ITimeoutService, 
     public $http: ng.IHttpService, 
     public $interpolate: ng.IInterpolateService) { 

     // do stuff with Typeahead/Bloodhound. 
     var bloodhoundSuggestions = new Bloodhound({ 
      datumTokenizer: _ => Bloodhound.tokenizers.obj.whitespace(_[this.inputValue]), 
      queryTokenizer: Bloodhound.tokenizers.whitespace, 
    } 

를 사용하고,이 결과 생성 된 자바 스크립트 불행하게도 webpack.config.js

globule = require("globule"); 

var configuration = { 
    context: __dirname, 
    resolve: 
    { 
     alias: { 
      typeahead: "typeahead.js" 
     } 
    }, 
    entry: [ 
     ...globule.find("client/*.ts", { srcBase: "wwwroot/js/admin" }) 
    ], 
    output: { 
     filename: "./wwwroot/js/admin/admin.js" 
    }, 
    module: { 
     rules: [ 
      { test: /\.ts$/, use: 'ts-loader' } 
     ] 
    } 
}; 

console.log(configuration); 
module.exports = configuration; 

에 위치 별칭을하는 것이 필요 파일, Bloodhound은 정의되지 않았습니다.

Webpack은 관련 require (323)를 포함하고 사용하는 것처럼 보이지만, Bloodhound은 정의되지 않으므로 분명히 작동하지 않습니다. 출력 파일에

이 있으면 제어기가 정의되기 직전에 require가 나타납니다.

Object.defineProperty(exports, "__esModule", { value: true });  
var angular_1 = __webpack_require__(16);  
__webpack_require__(323);  
/**  
* initialise and use a type ahead to find suggestions.  
*/  
var TypeAheadController = (function() { 

훨씬 더 파일 아래, 나는 정의되지 않은 블러드 하운드를 해결하려면 어떻게 323

/***/ }), 
/* 323 */ 
/***/ (function(module, exports, __webpack_require__) { 

/* WEBPACK VAR INJECTION */(function(setImmediate) {var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! 
* typeahead.js 0.11.1 
* https://github.com/twitter/typeahead.js 

찾을?

답변

0

이 패키지는 기발한 패키지입니다. 그것은 typeahead.js 이름 만 package.json의 "main" 항목은 실제로 수출은 Bloodhound 기능과 jQuery.fn에 선행 입력 기능을 부착된다. 설상가상으로 @types 패키지의 이름이 잘못되어 (.js 누락) "bloodhound"에서 가져올 것으로 예상되는 선언 형식으로 작성되었습니다. 이것은 고통 스럽지만 해결 될 수 있습니다. 없음에 유의합니다 (@types 패키지를 설치

npm install --save typeahead.js 
  • 을 (당신이 웹팩을 사용하고 있기 때문에)

    1. NPM과 typeahead.js를 설치 여기

      당신이 수행해야 할 단계입니다 .js, 이것은 성가신 것입니다)

      npm install --save @types/typeahead 
      
    2. 별칭을 제거하면 필요하지 않습니다. 특히, 다음 줄은 webpack.config.js에서 제거해야합니다

      typeahead: "typeahead.js" 
      
    3. 가 선언 파일을 만듭니다 ambience.d.ts (이름은 중요하지 않습니다) 불행하게도

      declare module "typeahead.js" { 
          export = Bloodhound; 
      } 
      

      위의 코드는 @types/typeahead이 무조건적으로 선언하는 전역 Bloodhound을 나타냅니다. 다행스럽게도 런타임에는 전역이 아닙니다.이 약하므로

      import { module } from "angular"; 
      import Bloodhound = require("typeahead.js"); // note the `.js` 
      
      class TypeAheadController { 
          static $inject = ["$log", "$timeout", "$http", "$interpolate"]; 
          constructor(
           readonly $log: ng.ILogService, 
           readonly $timeout: ng.ITimeoutService, 
           readonly $http: ng.IHttpService, 
           readonly $interpolate: ng.IInterpolateService) { 
      
           // do stuff with Typeahead/Bloodhound. 
           const bloodhoundSuggestions = new Bloodhound({ 
            datumTokenizer: _ => Bloodhound.tokenizers.obj 
             .whitespace(_[this.inputValue]), 
            queryTokenizer: Bloodhound.tokenizers.whitespace 
           }); 
          } 
      } 
      
    을 다음과 같이

  • 는 코드를 조정