Webpack捆绑不包括'sequelize'等特定模块

时间:2017-04-07 05:42:42

标签: node.js webpack sequelize.js

我正在使用webpack,seqelize以及其他具有以下webpack配置的模块开发nodejs。

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 个答案:

答案 0 :(得分:1)

您已将所有node_modules定义为externalsexternals: nodeModules,)。这意味着webpack不会捆绑来自node_modules的任何模块,只会让导入在运行时解析,就像在Node中运行它而不使用webpack一样。为此,您需要在运行捆绑软件的任何地方使用模块。

如果您希望webpack也捆绑node_modules,则可以删除externals选项。

你正在使用的外部配置可能来自Backend Apps with Webpack (Part I)(直接或间接),你应该阅读该博客文章,了解它的真实作用以及是否需要它。