2017-03-28 161 views
0

我从webpack收到以下错误。typescript:使用typescript和webpack解析typeahead.js 2

ERROR in ./wwwroot/js/admin/infrastructure/typeaheadComponent.ts Module not found: Error: Can't resolve 'typeahead' in ...

我有以下安装

npm install typeahead.js 
npm install @types/typeahead 

我的打字稿如下所示,使用node模块分辨率。

import { module } from "angular"; 
import "typeahead"; 
// necessary to import typeahead into JQuery, as otherwise 
// typeahead below is not defined. 

class TypeAheadController { 
    foo(e) { 
     $(e).typeahead(...) 
    } 
} 

这个如下生成JavaScript:

"use strict"; 
var angular_1 = require("angular"); 
require("typeahead"); 
var TypeAheadController = (function() { ... 

我webpack.config.js如下:

module.exports = { 
    context: __dirname, 
    entry: [ 
     "./app.ts", 
     "./tab.ts", 
     "./client/clientService.ts", 
     "./client/clientSearchComponent.ts", 
     "./infrastructure/messageComponent.ts", 
     "./infrastructure/typeaheadComponent.ts", 
     "./url.ts"], 
    output: { 
     filename: "./wwwroot/js/admin/admin.js" 
    }, 
    devtool: "source-map", 
    module: { 
     rules: [ 
      { test: /\.ts$/, use: 'ts-loader' } 
     ] 
    } 
}; 

导入一饮而尽任务。

如何指定typeahead位于node_modules/typeahead.js/dist/typeahead.bundle.js

回答

0

你可以使用别名来解决这个问题。

module.exports = { 
    /* ... everything you currently have */ 
    resolve: { 
    alias: { 
     typeahead: 'typeahead.js' 
    } 
    } 
} 
+0

它解决了部分问题,typeahead.js文件在被组件使用后包含在输出中,因此整个导入仍然被破坏,并且需要我手动包含typeahead.js文件。 – Jim

0

该模块被称为typeadhead.js,所以你还需要进口typeahead.js,不typeahead

import "typeahead.js"; 

导入总是与您用npm安装它的名称相同。它甚至不是特别的,它简单地查看node_modules并找到具有给定名称的目录。然后它会查看package.json并导入main field中指定的文件。另见Node.js - Folders as Modules

您可以使用resolve.alias来更改导入的名称,但在这种情况下没有很好的理由这么做。

+0

这不工作,当我改变'进口“预输入”''到进口“typeahead.js”'打字稿编译器失败,'财产预输入:在你的webpack.config.js要改变什么小例子,在类型JQuery'上不存在,正如我在问题中所解释的那样,导入是必需的,因为类型定义在typeahead中,而不是typeahead.js – Jim

+0

另外,如果我使用'import“typeahead.js”',webpack包含文件在输出中,但变量'Bloodhound'没有被定义,所以当文件被包含在输出中时,其中的类型不能在javascript中访问。 – Jim

相关问题