2017-03-02 8 views
0

Webpack 2.xを使用してAngular 2 Appをコンパイルします。プロダクションコードでは、コンパイルにはngc@ngtools/webpackのAotPluginの組み合わせを使用します。テストのために私はawesome-typescript-loaderを使用します。私のコードの生産ビルドは正常に動作します。しかし、私がnpm test何か非常に奇妙な何かが起こる... awesome-typescript-loaderは、コードをコンパイルすることに失敗したと文句を言うが、カルマはとにかくテストを実行し、それらはすべてパスします。Webpack/Karma/awesome-typescript-loaderはファイルを無視しません

bash-3.2$ npm test 
> [email protected] test /Users/tomb/Projects/brandontom.com/wp-content/themes/btc2017 
> NODE_ENV=test node ./node_modules/.bin/karma start --single-run=true 

webpack: wait until bundle finished: 

[at-loader] Using [email protected] from typescript and "tsconfig.json" from /Users/tomb/Projects/brandontom.com/wp-content/themes/b 
tc2017/tsconfig.json. 
[at-loader] Checking started in a separate process... 
[at-loader] Ok, 1.054 sec. 
ERROR in ./ngfactory/src/app/app.module.ngfactory.ts 
Module parse failed: /Users/tomb/Projects/brandontom.com/wp-content/themes/btc2017/ngfactory/src/app/app.module.ngfactory.ts Unexpe 
cted token (65:56) 
You may need an appropriate loader to handle this file type. 
| import * as import55 from '@angular/router/src/router_config_loader'; 
| import * as import56 from '@angular/router/src/router_state'; 
| class AppModuleInjector extends import0.NgModuleInjector<import1.AppModule> { 
| _CommonModule_0:import2.CommonModule; 
| _ApplicationModule_1:import3.ApplicationModule; 
@ ./bootstrap/main.aot.ts 1:0-78 
webpack: Failed to compile. 
Chrome 56.0.2924 (Mac OS X 10.12.3): Executed 4 of 4 SUCCESS (1.41 secs/0.758 secs) 

巧妙なトリックだが、私はむしろ、そのファイルが生成され、特に以来、最初の場所でそのファイルを解析しようとしてスキップしたいです。

私の最初の考えは、ファイルが生成されるディレクトリを無視することでした。というフォルダに構築されました。ここで私は私のwebpack.config.jsに次のルールを追加したルールです:

{ 
    test: /\.ts$/, 
    loaders: ['awesome-typescript-loader', 'angular2-template-loader'], 
    exclude: [/(node_modules|bootstrap|prebuild|ngfactory)/] 
} 

はしかしexcludeにもかかわらず、このファイルを解析しようとしているawesome-typescript-loader続けます。次に私はそれをカルマにするかもしれないと思ったので、除外ルールを私のkarma.conf.jsに追加しました。

module.exports = function (config) { 
    var _config = { 
    basePath: '', 
    frameworks: ['jasmine'], 
    files: [ 
     { pattern: './karma-shim.js', watched: false } 
    ], 
    exclude: [ 
     'bootstrap', 
     'dist', 
     'ngfactory',  // <--- here's where that file lives 
     'node_modules', 
     'prebuild' 
    ], 
... 
... 

私は(bootstrapというディレクトリに住んでいる)、ブートストラップファイルが解析されていたことに気づき、そのファイルがapp.module.ngfactory.tsをインポートしようとしていたアーティファクトフォルダ(prebuildngfactory)を削除すると、私は様々にbootstrapを追加しましたexcludeのプロパティ(tsconfig.jsonを含む)それでも、問題の発生を止めるものはありませんでした。誰もがこのようなことを見た場合、私はあなたがこの周りにどのようになったのか知りたいです。

がここにあります私の完全なwebpack.config.js

ここ
var neat = require('node-neat') 
var path = require('path') 
var webpack = require('webpack') 
var AotPlugin = require('@ngtools/webpack').AotPlugin 

var sassPaths = neat.includePaths.map(function (path) { 
    return 'includePaths[]=' + path 
}).join('&') 

module.exports = (function (nodeEnv) { 
    var config = { 
    entry: { 
     globals: [ 'core-js/client/shim.min', 'reflect-metadata', 'zone.js' ], 
     main: path.resolve(__dirname, 'bootstrap') + '/main.aot.ts' 
    }, 
    devServer: { 
     inline: true 
    }, 
    module: { 
     rules: [ 
     { test: /\.html$/, loader: 'raw-loader' }, 
     { test: /\.scss$/, loader: 'raw-loader!css-loader!sass-loader?' + sassPaths, exclude: /node_modules/ } 
     ] 
    }, 
    output: { 
     filename: '[name].js', 
     path: path.resolve(__dirname, 'dist') 
    }, 
    resolve: { 
     extensions: ['.js', '.ts'] 
    }, 
    plugins: [ 
     new webpack.ContextReplacementPlugin(
     /angular(\\|\/)core(\\|\/)(esm(\\|\/)src|src)(\\|\/)linker/, 
     __dirname 
    ), 
     new webpack.DefinePlugin({ 
     process: { env: { NODE_ENV: JSON.stringify(nodeEnv) } } 
     }) 
    ] 
    } 
    if (nodeEnv !== 'test') { 
    config.module.rules.push({ 
     test: /\.ts$/, 
     loader: '@ngtools/webpack' 
    }) 
    config.plugins.push(new AotPlugin({ 
     tsConfigPath: './tsconfig.json' 
    })) 
    config.plugins.push(new webpack.optimize.UglifyJsPlugin({ 
     mangle: { screw_ie8: true, keep_fnames: true }, 
     compress: { screw_ie8: true, warnings: false }, 
     comments: false 
    })) 
    } else { 
    config.module.rules.push({ 
     test: /\.ts$/, 
     loaders: ['awesome-typescript-loader', 'angular2-template-loader'], 
     exclude: [/(node_modules|bootstrap|prebuild|ngfactory)/] 
    }) 
    } 
    return config 
})(process.env.NODE_ENV) 

だ私のtsconfig.json:良い測定のために

{ 
    "compilerOptions": { 
    "target": "es5", 
    "module": "es2015", 
    "moduleResolution": "node", 
    "emitDecoratorMetadata": true, 
    "experimentalDecorators": true, 
    "sourceMap": true, 
    "noEmitHelpers": false, 
    "noUnusedLocals": false, 
    "noUnusedParameters": false, 
    "outDir": "./prebuild", 
    "lib": [ 
     "es2015", 
     "dom" 
    ], 
    "types": [ 
     "jasmine", 
     "node" 
    ] 
    }, 
    "compileOnSave": false, 
    "buildOnSave": false, 
    "awesomeTypescriptLoaderOptions": { 
    "forkChecker": true, 
    "useWebpackText": true 
    }, 
    "angularCompilerOptions": { 
    "genDir": "./ngfactory", 
    "entryModule": "src/app/app.module#AppModule" 
    } 
} 

は、ここで私のkarma.conf.js同様です:

var webpackConfig = require('./webpack.config') 

module.exports = function (config) { 
    var _config = { 
    basePath: '', 
    frameworks: ['jasmine'], 
    files: [ 
     { pattern: './karma-shim.js', watched: false } 
    ], 
    exclude: [ 
     'bootstrap', 
     'dist', 
     'ngfactory', 
     'node_modules', 
     'prebuild' 
    ], 
    preprocessors: { 
     './karma-shim.js': ['webpack'] 
    }, 
    webpack: webpackConfig, 
    webpackMiddleware: { 
     stats: 'errors-only' 
    }, 
    webpackServer: { 
     noInfo: true 
    }, 
    progress: ['progress'], 
    port: 9876, 
    color: true, 
    logLevel: config.LOG_ERROR, 
    browsers: ['Chrome'] 
    } 
    config.set(_config) 
} 

答えて

1

私はできなかったが、 awesome-typescript-loaderの成果物のコンパイルを停止するには、私はそれがいつでも失敗するのを止めることができました。ローダーには、transpileOnlyというブール値設定があります。これをtrueに設定すると、ローダーがタイプチェックを実行できなくなります。 awesomeTypescriptLoaderOptionsセクションのtsconfig.jsonに追加しました。

これは理想的ではありませんが、私は大丈夫です(今のところ)awesome-typescript-loaderはテスト側でタイプチェックを実施していません...私は推測します... ngcがプロダクションコードでそれを強制している限り。

は、ここに私のtsconfig.json

{ 
    "compilerOptions": { 
    "target": "es5", 
    "module": "es2015", 
    "moduleResolution": "node", 
    "emitDecoratorMetadata": true, 
    "experimentalDecorators": true, 
    "sourceMap": true, 
    "noEmitHelpers": false, 
    "noUnusedLocals": false, 
    "noUnusedParameters": false, 
    "outDir": "./prebuild", 
    "lib": [ 
     "es2015", 
     "dom" 
    ], 
    "types": [ 
     "jasmine", 
     "node" 
    ] 
    }, 
    "compileOnSave": false, 
    "buildOnSave": false, 
    "awesomeTypescriptLoaderOptions": { 
    "forkChecker": true, 
    "useWebpackText": true, 
    "transpileOnly": true 
    }, 
    "angularCompilerOptions": { 
    "genDir": "./ngfactory", 
    "entryModule": "src/app/app.module#AppModule" 
    } 
} 
です
関連する問題