TypeScript + Webpack 使った時に出たエラーと対処したこと
loaders に loader を指定する時は test
プロパティのパターンで絞り込むこと
html-loader を使おうと思って .html のファイルを require() したら、ts-loader に渡って解釈されてしまったので、絶対つけること。 当たり前っぽいけどこれでハマったので。
ERROR in ./src/component/root-index.html Module build failed: Error: Could not find file: 'C:\msys64\home\tyru\git\scrader\src\component\root-index.html'. at getValidSourceFile (C:\msys64\home\tyru\git\scrader\node_modules\typescript\lib\typescript.js:79277:23) at Object.getEmitOutput (C:\msys64\home\tyru\git\scrader\node_modules\typescript\lib\typescript.js:79644:30) at getEmit (C:\msys64\home\tyru\git\scrader\node_modules\ts-loader\dist\index.js:99:43) at Object.loader (C:\msys64\home\tyru\git\scrader\node_modules\ts-loader\dist\index.js:27:11) @ ./src/component/root-index.ts 11:14-42 @ multi ./src/init.ts ./src/component/root-index.ts ./src/routes.ts
module.exports = { // ... module: { loaders: [ { test: /\.ts$/, // これを必ずつける exclude: /(node_modules)/, loader: 'ts-loader' }, { test: /\.html$/, loader: 'html-loader', query: { minimize: true } } ] } }
「error TS2304: Cannot find name ‘require'」と言われる時は require() の型宣言をしてやること
declare function require(x: string): any;
このような型宣言をしないと、以下のようなエラーが出る。
ERROR in ./src/component/root-index.ts (12,15): error TS2304: Cannot find name 'require'.
以下のような通常の require() をしてる時は必要ないみたいだけど、
import angular = require('angular'); import 'angular-ui-router'; angular.module('scrader', ['ui.router']);
このように式の中?で require() をすると型宣言が必要になる。 正直 TypeScript 力が低すぎてよく分かってない。
// 以下の1行がないとコンパイルエラー!! declare function require(x: string): any; class RootIndex { msg: string; constructor() { this.msg = 'Hello!'; } } angular.module('scrader') .component('rootIndex', { template: require('./root-index.html'), // template: `<div ng-bind='$ctrl.msg'></div>`, controller: [RootIndex] });
WebPack と html-loader 便利すぎる。 Gulp より「コード」っぽい設定を書かずに済むし、loader めっちゃ便利だし、WebPack 大好きになってきた。 require() でコードに事前に*1色々埋め込める仕組みというのが気に入った。
参考記事
- TypeScript と Node.js で hello, world をする http server を作る - あいつの日誌β
- webpackを使い倒す - Thujikun blog
- WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】 | 株式会社LIG
- javascript - How to use Webpack with Angular + templateCache? - Stack Overflow
- これで html-loader を知った
Special Thanks
TS の test、最後の $ が抜けてるかな?https://t.co/l9XeEAirN7
— 鳥頭なフレンズ (@kariya_mitsuru) 2017年2月19日
*1:「静的に」と言っていいんだろうか?