3

建筑学

我想在客户端和服务器端之间共享代码。我在 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).ensurerequire替换所有出现的。我不知道r(2)零件是否总是相同的,因此可能不会自动化。

解决了

感谢ColCh告诉我如何在这里做。

require = require('enhanced-require')(module, require('../../webpack.config'));

通过更改 node.js 中的require方法,它将使 node.js 通过 webpackrequire功能传递所有要求,这允许我们使用别名和其他礼物!谢谢科尔奇!

有关的

谢谢

4

2 回答 2

3

感谢ColCh告诉我如何在这里做。

require = require('enhanced-require')(module, require('../../webpack.config'));

通过更改 node.js 中的require方法,它将使 node.js 通过 webpackrequire功能传递所有要求,这允许我们使用别名和其他礼物!谢谢科尔奇!

于 2014-12-02T20:04:56.473 回答
0

我的解决方案是:

{
    // make sure that webpack will externalize
    // modules using Node's module API (CommonJS 2)
    output: { ...output, libraryTarget: 'commonjs2' },

    // externalize all require() calls to non-relative modules.
    // Unless you do something funky, every time you import a module
    // from node_modules, it should match the regex below
    externals: /^[a-z0-9-]/,

    // Optional: use this if you want to be able to require() the
    // server bundles from Node.js later
    target: 'node'
}
于 2016-02-01T10:02:50.837 回答