2015-11-02 70 views
7

我想在我的項目中使用一個非常新的第三方模塊,我使用npm進行了安裝。該模塊顯然是在一個不區分大小寫的文件系統的操作系統上開發的,所以它需要一個文件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 

index.js文件中的node_modules/the module in question/dist文件夾,需要從供應商文件夾中的文件Injectable.js,但用命令這樣做require('./decorators/providers/injectable');

我想別名./decorators/providers/injectable那個index.js./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:

這裏的WebPack的配置文件:

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

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模塊未找到:錯誤:無法解析'文件'或'目錄'./decorators/providers/injectable in /node_modules/ng-forward/dist @ ./~/ng-forward/dist/index.js 125:37-81 – azangru

+0

當你用'function(){console.log('called')}替換'require.resolve('...')' ',在您的webpack輸出中的任何位置是否「打印」? –

+0

我實際上試圖做到這一點,看看作爲參數傳遞給這個函數的內容。但它沒有被調用。 – azangru