Webpack打包cookpete/poker-odds库未导出预期函数问题排查
打包cookpete/poker-odds库用于Swift JavascriptCore的问题解决
问题背景
尝试打包JavaScript库cookpete/poker-odds以在Swift JavascriptCore中使用,webpack打包后在Node REPL执行const bundle = require("./bundle.js")得到空对象,期望导出源码中用export标记的calculateEquity()函数,手动添加module.exports = {...}后仍无内容导出。
操作流程
git clone https://github.com/cookpete/poker-odds.git && cd poker-odds npm run build # 生成/lib目录 添加webpack.config.js # 如下所示 npx webpack # 在dist目录生成bundle.js cd dist # 进入dist目录 node # 启动Node REPL const bundle = require("./bundle.js") console.log("bundle:", bundle) # 输出bundle: {};期望包含calculateEquity()
当前webpack配置
module.exports = { mode: 'development', entry: './lib/calculate.js', // 这个配置是否正确? output: { filename: 'bundle.js', }, };
疑问
- webpack.config.js中正确的entry属性应该是什么?如何导出calculateEquity()函数?
- 该库使用了babel,是否会导致问题?
- 该库构建过程生成的.json文件是否会造成影响?
解决方案
1. 修正webpack配置以支持Node模块导出
你的entry路径./lib/calculate.js是正确的,但默认webpack打包的是浏览器环境的自执行代码,Node环境无法通过require获取导出内容。需要修改output配置,指定模块导出格式:
module.exports = { mode: 'development', entry: './lib/calculate.js', output: { filename: 'bundle.js', libraryTarget: 'commonjs2' // 关键:让打包产物支持Node的module.exports规范 }, };
重新打包后,在Node REPL中require就能得到包含calculateEquity的对象。
如果仍有问题,可以创建一个自定义入口文件(比如src/index.js),显式导出目标函数:
// src/index.js import { calculateEquity } from './lib/calculate'; module.exports = { calculateEquity };
然后修改webpack的entry为./src/index.js。
2. Babel不会导致问题
该库的npm run build已经通过Babel完成了代码转译,转译后的代码符合ES模块规范,webpack可以正常处理,不会导致导出为空的问题。
3. 生成的.json文件无影响
构建过程生成的.json文件是库的依赖资源(比如牌型数据),webpack会自动处理模块对该文件的引入,打包时会将其内容嵌入或正确加载,不会导致导出空对象的问题。
内容的提问来源于stack exchange,提问作者user3320795
相关产品推荐
相关产品推荐

