建筑学
我想在客户端和服务器端之间共享代码。我在 webpack 配置中定义了别名:
resolve: {
// Absolute paths: https://github.com/webpack/webpack/issues/109
alias: {
server : absPath('/src/server/'),
app : absPath('/src/app/'),
client : absPath('/src/client/'),
}
},
问题
现在在服务器端,我需要包含 webpack 以便在需要文件时识别正确的路径。例如
require('app/somefile.js')
在纯 node.js 中将失败,因为找不到 app 文件夹。
我需要什么(阅读我需要什么更新部分)
我需要能够使用 webpack 别名。我正在考虑制作一个没有来自 node_modules 的任何文件的所有服务器部分的捆绑包。这样,当服务器启动时,它将使用 node_modules 文件夹中的 node_modules 而不是缩小的 js 文件(为什么?第一个:它不起作用。第二个:不好,因为 node_modules 是基于平台编译的。所以我不希望我的 win 文件在 unix 服务器上运行)。
输出:
server.js
不包含任何 node_modules 的编译文件。- 让
server.js
使用node_modules;
我需要更新的内容
正如我在https://github.com/webpack/webpack/issues/135中注意到的那样,制作捆绑的 server.js 会弄乱所有 io 操作文件路径。
一个更好的主意是保留 node.js 服务器文件原样,但用require
自定义 webpack 替换提供的方法,该 webpackrequire
考虑了别名(其他?)等帐户配置......可以按照 require.js 的方式完成在 node.js 服务器上运行。
我试过的
通过在 webpack 中添加这个插件
new webpack.optimize.CommonsChunkPlugin(/* chunkName= */"ignore", /* filename= */"server.bundle.js")
参赛作品:
entry: {
client: "./src/client/index.js",
server: "./src/server/index.js",
ignore: ['the_only_node_module'] // But I need to do that for every node_module
},
它将创建一个仅包含我的服务器代码的文件 server.js。然后创建一个未使用的 server.bundle.js。但问题是 webpack在文件中包含了该webpackJsonp
函数。server.bundle.js
因此客户端和服务器都无法工作。
这应该是一种仅在一个条目上禁用 node_modules 的方法。
我试过的#2
我已经设法排除了路径,但是因为已经缩小,所以 requires 不起作用。所以源看起来像require(3)
而不是require('my-module')
. 每个 require 字符串都已转换为整数,因此它不起作用。
为了工作,我还需要修补 webpack 导出的 require 函数以添加 node.js 原生 require 函数(这很容易手动完成,但应该自动完成)。
我试过的#3
在 webpack 配置中:
{target: "node"}
这只会添加一个exports
变量(不确定它还有什么作用,因为我已经区分了输出)。
我尝试过的#4(几乎在那里)
使用
require.ensure('my_module')
然后用r(2).ensure
require替换所有出现的。我不知道r(2)
零件是否总是相同的,因此可能不会自动化。
解决了
require = require('enhanced-require')(module, require('../../webpack.config'));
通过更改 node.js 中的require
方法,它将使 node.js 通过 webpackrequire
功能传递所有要求,这允许我们使用别名和其他礼物!谢谢科尔奇!
有关的
- https://www.bountysource.com/issues/1660629-what-s-the-right-way-to-use-webpack-specific-functionality-in-node-js
- https://github.com/webpack/webpack/issues/135
- http://webpack.github.io/docs/configuration.html#target
- https://github.com/webpack/webpack/issues/458
- 如何使用 Webpack 同时创建捆绑包的“网络”和“节点”版本?
- http://nerds.airbnb.com/isomorphic-javascript-future-web-apps/
谢谢