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

问题描述:

我试图从nodejs中运行webpack。我的目录结构是这样的:使用nodejs API找不到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. 它看起来像是与捆绑资产走错了 - 因为看起来的WebPack在node_modules找到其IT资产,将是最好的,如果你可以发布您的package.json旁边的其他文件。
  2. 你正在使用webpack而不是默认webpack命令,它通常会提供大量的调试输出(以及有关构建步骤,错误等的信息) - 我会建议使用它来调试它,并且然后在知道一切正常后切换到编程方法。
  3. 它看起来像你想做反应的服务器端渲染。然后,您的webpack配置需要一些特殊配置。这已经在这里处理:http://jlongster.com/Backend-Apps-with-Webpack--Part-I

没有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); 
}); 
+0

它似乎无法编译在app.js 无需巴贝尔装载机。 'npm我--save-dev babel-loader'解决了这个问题。 – Philiiiiiipp

+0

一个小警告:使用私有组织时,软件包将安装在node_modules/@ organization/packageName下,因此您必须在readdirSync之后“手动”添加它们。用'nodeModules ['@ myorg/mypackage'] ='commonjs mypackage' – alfonsodev