webpack - 当目标模块在 node_modules 中时,Webpack 的别名不起作用
问题描述
背景
我正在用打字稿编写一个 SSR 反应应用程序,我必须使用一个客户端模块(client-logger
),它只能在客户端运行,因为它是 AMD 模块系统。在 Node 上运行会报错。
我目前的解决方案是在编译时将client-logger
模块替换为仅用于服务器捆绑包的模块。rewrite-client-logger
我已经尝试过 WebpackNormalModuleReplacementPlugin
和alias
,甚至编写了我自己的加载器,它们都不起作用,这是我的别名的Webpack 配置。
这是 repro 的演示链接:https ://github.com/stanleyyylau/demo
复制步骤:
- Git 克隆并签出到 Master 分支
npm install
安装所有依赖项- 复制
client-logger
到 node_modulescp -rf ./client-logger ./node_modules
npm run build
触发构建npm run start
运行通用应用程序
预期结果:
- 服务器应该在没有错误的情况下运行
- 服务器捆绑包
client-logger
应替换为(您可以通过在文件中rewrite-client-logger
搜索字符串来验证这一点。)register event
assets/server.js
实际结果:
节点给出运行时错误
ReferenceError: define is not defined
client-logger
未被替换rewrite-client-logger
(别名替换仅在client-logger
不在node_modules
文件夹中时有效。)如果有人在编译时有其他方法来替换模块,请告诉我,非常感谢。
解决方案
您可以通过更改webpack-node-externals配置以包含记录器来解决此问题。这样,别名规则就有机会发挥作用。尝试
externals: [nodeExternals({
whitelist: ['client-logger']
})]
推荐阅读
- google-app-engine - Golang 源文件在 App Engine 中消失了
- r - 如何使用 dplyr 基于缺失条件合并两个数据框?
- sql - oracle sql Developer花时间获取所有记录
- kubernetes - Helm 插值
- php - 根据php中的字段对多维数组进行排序
- javascript - JS Array Reduce 的好奇反应
- python - 用 0 填充缺失的日期(天)值
- pandas - 用于除法的熊猫数据框操作为 0
- mysql - 从 2 个表创建 mysql 视图,第一个表列值和第二个表列值应该匹配
- python - 如何在 django 中按类别过滤