使用nodejs API在webpack中找不到入口模块

时间:2016-04-26 09:46:37

标签: node.js webpack

我正在尝试从nodejs中运行webpack。我的目录结构如下所示:

build
|- dev.js
dist
|- bundle.js
src
|- layout
   |- App.js
|- server
   |- app.js

dev.js:

const webpack = require('webpack');
const path = require('path');

// returns a Compiler instance
const compiler = webpack(
  {
    context: path.resolve(__dirname, '../src'),
    entry: [
      './server/app.js'
    ],
    output: {
      path: path.join(__dirname, '../dist'),
      filename: 'bundle.js'
    },
    module: {
      loaders: [
        {
          test: /\.js$/,
          exclude: /node_modules/,
          loader: 'babel-loader?presets[]=es2015&presets[]=react'
        }
      ]
    }
  }
);

compiler.run(function(err, stats) {
  if(err) {
    console.log('Err');
  }
});

app.js:

import express from 'express';

import React from 'react';
import { renderToString } from 'react-dom/server';

import App from '../layout/App';
const app = express();

app.get('*', (req, res) => {
  res.send(renderToString(<App />));
});


app.listen(3000, () => {
});

如果我现在运行node build/dev.js它会生成我的bundle.js,但它找不到我的入口模块。

(function webpackMissingModule() { throw new Error("Cannot find module \"./server/app.js\""); }());

即使我认为应该如何定义入口点,我已经尝试了很多组合,甚至是绝对路径。但总是一样的结果,它找不到入门模块。我在这里缺少什么?

1 个答案:

答案 0 :(得分:2)

  1. 看起来捆绑资产出了问题 - 因为webpack会在你的node_modules中找到它的资产,最好是你可以将package.json和其他文件一起发布。
  2. 您以编程方式使用webpack而不是默认的webpack命令,这通常会提供大量的调试输出(以及有关构建步骤,错误等的信息) - 我建议使用要调试它,然后在知道一切正常时切换到编程方法。
  3. 看起来你想用反应进行服务器端渲染。然后,您的webpack配置需要一些特殊配置。这已在此处理:http://jlongster.com/Backend-Apps-with-Webpack--Part-I
  4. 如果没有package.json,那么确实很难调整到底出了什么问题。

    假设你的package.json是正确的,这里有一个dev.js文件可以使用上面的代码:

    const webpack = require('webpack');
    const path = require('path');
    const fs = require('fs');
    
    var nodeModules = {};
    fs.readdirSync('node_modules')
      .filter(function(x) {
        return ['.bin'].indexOf(x) === -1;
      })
      .forEach(function(mod) {
        nodeModules[mod] = 'commonjs ' + mod;
      });
    
    // returns a Compiler instance
    const compiler = webpack(
      {
        context: path.resolve(__dirname, "../src"),
        target: 'node',
        entry: [
          './server/app.js'
        ],
        output: {
          path: path.join(__dirname, '../dist'),
          filename: 'bundle.js'
        },
        module: {
          loaders: [
            {
              test: /\.js$/,
              exclude: /node_modules/,
              loader: 'babel-loader?presets[]=es2015&presets[]=react'
            }
          ]
        },
        externals: nodeModules
      }
    );
    
    compiler.run(function(err, stats) {
      console.log(err, stats);
    });