我的应用程序的目录结构或多或少是这样的:
src-program/
- 包含前端代码,包括package.json
和webpack.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服务器进程之间共享代码的好方法是什么?
答案 0 :(得分:0)
您可以将共享模块打包为npm软件包(甚至只是驻留在文件系统上的软件包)吗?然后,您的src-program
和src-server
项目可以将其作为依赖项添加到其package.json
中,并将其复制到各自的node_modules
文件夹中。
请参阅:how to specify local modules as npm package dependencies