2015-11-02 8 views
7

私はnpmを使用してインストールした非常に新しいサードパーティのモジュールをプロジェクトで使用しようとしています。このモジュールは、大文字と小文字を区別しないファイルシステムを持つOS上で開発されたことが明らかになったので、ファイルinjectable.jsが必要ですが、実際のファイル名はInjectable.jsです。これにより、バンドル処理が中断されます。Webpackを使用したファイルの置換/エイリアス

モジュールの開発者は、この問題を認識しています。一方、私はモジュールをそのまま使用する方法を見つけようとしています。私はWebpackを使ってプロジェクトをバンドルしています。

私のプロジェクトの関連部分のツリー構造は大体これです:

├──config 
│  ├──webpack 
│   ├──webpack.js 
│ 
├──src 
│ ├──client 
│  ├──index.js 
│ 
│ 
├──node_modules 
│ ├──the module in question 
│   ├── dist 
│   │   ├── decorators 
│   │   │   ├── providers 
│   │   │      ├── Injectable.js 
│   │   │ 
│   │ ├── index.js 
| 
├──gulpfile.js 

node_modules/the module in question/distフォルダ内のファイルがindex.jsプロバイダフォルダからファイルInjectable.jsを必要とするが、コマンドでそうしているrequire('./decorators/providers/injectable');

index.js./decorators/providers/injectableという別名を付けたいと思います。./decorators/providers/Injectableです。ここで

は、私は私のwebpack.jsファイルでやっているものです:

resolve: { 
     alias: { 
      './decorators/providers/injectable': './decorators/providers/Injectable.js', 
     }, 
} 

しかし、これはまだ動作しません。エラーが発生しましたModule not found: Error: Cannot resolve 'file' or 'directory' ./decorators/providers/injectable

Webpackにバンドルする際にノードモジュール内のファイル名を別の名前に置き換える方法を教えてください。

UPDATE:

var path = require('path'); 
var rucksack = require('rucksack-css')({ 
    fallbacks: true, 
    autoprefixer: true 
}); 
var precss = require('precss'); 
var csswring = require('csswring'); 
var webpack = require('webpack'); 

module.exports = { 
    context: path.join(__dirname, '../../'), 
    debug: false, 
    entry: [ 
     './src/client/' 
    ], 
    output: { 
     path: path.join(__dirname, '../../public/assets/js'), 
     filename: 'bundle.js' 
    }, 
    module: { 
     loaders: [ 
      { 
       test: /\.js$/, 
       exclude: /node_modules/, 
       loader: 'babel?stage=1' 
      }, 
      { 
       test: /\.css$/, 
       loader: 'style-loader!css-loader!postcss-loader' 
      }, 
      {test: /\.png$/, loader: 'file-loader'}, 
      {test: /\.gif$/, loader: 'file-loader'}, 
      {test: /\.jpe?g$/, loader: 'file-loader'}, 
      {test: /\.eot$/, loader: 'file-loader'}, 
      {test: /\.woff2?$/, loader: 'file-loader'}, 
      {test: /\.ttf$/, loader: 'file-loader'}, 
      {test: /\.svg$/, loader: 'file-loader'} 
     ] 
    }, 
    postcss: function() { 
     return [rucksack, precss, csswring]; 
    }, 
    plugins: [ 
     new webpack.NormalModuleReplacementPlugin(
      /ng-forward\/dist\/decorators\/providers\/injectable\.js/, 
      require.resolve('ng-forward/dist/decorators/providers/Injectable') 
     ) 
    ], 
    resolve: { 
     extensions: ['', '.js'] 
    } 
}; 

答えて

12

使用webpack.NormalModuleReplacementPlugin

ここでのWebPACKのconfigファイルだ

plugins: [ 
    new webpack.NormalModuleReplacementPlugin(
    /ng-forward\/dist\/decorators\/providers\/injectable\.js/, 
    require.resolve('ng-forward/dist/decorators/providers/Injectable') 
), 
], 
+0

は先に行って、ということを試してみましたが、それでも中にエラー 'ERRORを取得しています./~/ ng-forward/dist/index.jsモジュールが見つかりません:エラー: 'file'または 'directory'を解決できません。/node_modules/ng-forward/dist で./decorators/providers/injectable @./~/~/~/~/~/~/ng/forward/dist/index.js 125:37-81 – azangru

+0

'require.resolve( '...')'を 'function(){console.log( 'という名前)に置き換えると、 '、あなたのwebpackの出力のどこにでも印刷されていますか? –

+0

私は実際に何がこの関数の引数として渡されるのか見るためにこれを試みました。しかしそれは呼ばれなかった。 – azangru

関連する問題