【发布时间】:2017-02-06 15:16:57
【问题描述】:
我的应用程序有一个或多或少这样的目录结构:
-
src-program/- 包含前端代码,包括package.json和webpack.config.js -
src-server/- 包含后端代码,包括不同的package.json和.babelrc -
shared/foo.js- 是前端和后端都需要的 JavaScript 代码
所有代码都使用 ES2015 语法,因此使用 Babel 进行转译。
对于前端,“转译”是在 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 服务器进程之间共享代码的好方法是什么?
【问题讨论】: