使用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\""); }());
即使我认为这是如何定义入口点,我已经尝试了许多组合,即使是绝对路径。但总是相同的结果,它无法找到入口模块。我在这里错过了什么?
答
- 它看起来像是与捆绑资产走错了 - 因为看起来的WebPack在
node_modules
找到其IT资产,将是最好的,如果你可以发布您的package.json旁边的其他文件。 - 你正在使用webpack而不是默认
webpack
命令,它通常会提供大量的调试输出(以及有关构建步骤,错误等的信息) - 我会建议使用它来调试它,并且然后在知道一切正常后切换到编程方法。 - 它看起来像你想做反应的服务器端渲染。然后,您的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);
});
它似乎无法编译在app.js 无需巴贝尔装载机。 'npm我--save-dev babel-loader'解决了这个问题。 –
Philiiiiiipp
一个小警告:使用私有组织时,软件包将安装在node_modules/@ organization/packageName下,因此您必须在readdirSync之后“手动”添加它们。用'nodeModules ['@ myorg/mypackage'] ='commonjs mypackage' – alfonsodev