如何在Webpack构建和NodeJS服务器进程之间共享代码?

时间:2016-09-28 14:50:20

标签: node.js webpack babeljs

我的应用程序的目录结构或多或少是这样的:

  • src-program/ - 包含前端代码,包括package.jsonwebpack.config.js
  • src-server/ - 包含后端代码,其中包含不同的package.json.babelrc
  • shared/foo.js - 是前端和后端都需要的JavaScript代码

所有代码都使用ES2015语法,因此使用Babel进行转换。

对于前端" transilation"在Webpack构建期间使用babel-loader完成。

对于后端,它由babel-register即时完成。

shared/foo.js需要其他模块,这些模块位于前端和后端的package.json文件中。

由于NodeJS / Webpack如何解析模块,共享模块无法正常找到。

对于Webpack,我使用这种配置以一种有点hacky的方式解决了这个问题:

resolve: {
  root: __dirname,
  fallback: [
    __dirname + "/../shared",
    __dirname + "/node_modules"

  ],
  extensions: ['', '.js', '.jsx']
},

第一个fallback确保"共享"模块已解析,第二个fallback确保共享模块所需的模块仍然解析为前端node_modules目录。

这允许包含共享模块,如下所示:

import * as foo from 'foo';

但是,我很难让后端(即NodeJS)以相同的方式解析共享模块。

我尝试使用app-module-path,这使foo.js解析,但该文件未由Babel或其他Babel模块处理,例如transform-runtime间接 foo.js}所需的内容无法解析,因为它们位于src-server/node_modules ...

我可以通过预先编译代码而不是使用babe-register解决问题,但无论如何都感觉不对。

那么,在Webpack构建和NodeJS服务器进程之间共享代码的好方法是什么

1 个答案:

答案 0 :(得分:0)

您可以将共享模块打包为npm软件包(甚至只是驻留在文件系统上的软件包)吗?然后,您的src-programsrc-server项目可以将其作为依赖项添加到其package.json中,并将其复制到各自的node_modules文件夹中。

请参阅:how to specify local modules as npm package dependencies