2017-04-07 93 views
0

我正在開發帶有webpack,seqelize和其他模塊的nodejs,下面的webpack配置。Webpack捆綁不包括特定的模塊,如'sequelize'

const path = require('path'); 
const webpack = require('webpack'); 
const fs = require('fs'); 
const glob = require('glob'); 
const CleanWebpackPlugin = require('clean-webpack-plugin'); 

var nodeModules = {}; 
fs.readdirSync('node_modules') 
    .filter(function(x) { 
    return ['.bin'].indexOf(x) === -1; 
    }) 
    .forEach(function(mod) { 
    nodeModules[mod] = 'commonjs ' + mod; 
    }); 

module.exports = { 
    // entry: [ path.resolve(__dirname, 'server.js'), models ], 
    entry: glob.sync(path.resolve(__dirname, 'src/**/*.js')), 
    resolve: { 
    // Add `.ts` and `.tsx` as a resolvable extension. 
    root  : [path.resolve(__dirname, '')], 
    extensions: ['', '.webpack.js', '.web.js', '.ts', '.tsx', '.js'], 
    modulesDirectories: ['node_modules'] 
    }, 
    module: { 
    loaders: [ 
     { 
     test: /\.js$/, 
     loader: 'babel', 
     exclude: /node_modules/, 
     query: { 
      cacheDirectory: true, 
      presets: ['es2015'] 
     } 
     }, { 
     test: /\.json$/, 
     loader: 'json' 
     } 
    ] 
    }, 
    plugins: [ 
    new CleanWebpackPlugin(['build'], { 
     root: path.resolve(__dirname, ''), 
     verbose: true, 
     dry: false, 
     exclude: [], 
     watch: true 
    }) 
    ], 
    node: { 
    __filename: true, 
    __dirname: true 
    }, 
    target: 'node', 
    externals: nodeModules, 
    output: { 
    path: path.resolve(__dirname, 'build'), 
    filename: 'server.[chunkhash].js', 
    libraryTarget: 'commonjs' 
    } 
} 

在這種情況下,我嘗試用捆綁的配置整個源,然後得到一個名爲server.[chunkhash].js捆綁的文件。

我想將文件移動到服務器,並使用像node server.[chuckhash].js這樣的命令工作,但是,我收到了如下所示的消息。

module.js:472 
    throw err; 
    ^

Error: Cannot find module 'sequelize' 
    at Function.Module._resolveFilename (module.js:470:15) 
    at Function.Module._load (module.js:418:25) 
    at Module.require (module.js:498:17) 
    at require (internal/module.js:20:19) 
    ... 

所以,我試圖找到具體的點,使錯誤,然後發現我models/index.js使用seqelize模塊下面的代碼。

import fs from 'fs'; 
import path from 'path'; 
import Sequelize from 'sequelize'; 
import config from 'config/env'; 

const sequalize = new Sequelize(config.mysql.database, config.mysql.username, config.mysql.password, config.mysql.params.options); 
const db = {}; 

fs.readdirSync(__dirname) 
    .filter(file => { 
    return (file.indexOf('.') !== 0) && (file !== 'index.js'); 
    }) 
    .forEach(file => { 
    const model = sequalize.import(path.resolve(__dirname, file)); 
    db[model.name] = model; 
    }); 

Object.keys(db).forEach(modelName => { 
    if ('associate' in db[modelName]) { 
    db[modelName].associate(db); 
    } 
}); 

db.sequelize = sequalize; 
db.Sequelize = Sequelize; 

export default db; 

我該如何解決這個問題?

實際上,與同一個文件夾中的nodemodule一樣,沒有錯誤,但是,使捆綁文件發生錯誤。

回答

1

您將所有node_modules定義爲externalsexternals: nodeModules,)。這意味着webpack不會綁定來自node_modules的任何模塊,只會在運行時讓導入問題得到解決,就像在Node中運行時不使用webpack一樣。爲了這個工作,你需要在你運行軟件包的地方使用這些模塊。

如果您想要webpack綁定node_modules,您可以刪除externals選項。

的配置的外部您正在使用可能來到(直接或間接)從Backend Apps with Webpack (Part I),你應該閱讀博客文章來了解它的真正在做什麼以及你是否需要它。