使用Rollup打包aws-iot-device-sdk时出现undefined问题求助
解决Rollup打包aws-iot-device-sdk后出现undefined的问题
我之前踩过这个坑,aws-iot-device-sdk在Rollup打包后出现undefined,大多是因为这个库原本是为Node.js环境设计的,浏览器环境下需要额外处理它的依赖和导出逻辑。结合你的配置,给你几个靠谱的排查和解决方向:
1. 让CommonJS插件正确识别SDK的导出
aws-iot-device-sdk是CommonJS模块,Rollup默认只处理ES模块,所以需要commonjs插件明确映射它的导出。你可以调整插件配置,手动指定它的命名导出:
commonjs({ include: 'node_modules/**', namedExports: { // 根据你用到的功能,映射SDK的导出项 'aws-iot-device-sdk': ['device', 'thingShadow', 'jobs'] } })
2. 完善globals插件的配置
你提到了globals但没给出具体配置,浏览器环境下需要把Node.js内置模块映射到合适的全局变量或polyfill。比如WebSocket模式下不需要net和tls,可以直接设为false:
globals({ 'aws-iot-device-sdk': 'AWSIoT', // 指定SDK打包后的全局变量名 'crypto': 'crypto', // 如果用到加密功能,确保有对应的polyfill 'net': false, 'tls': false })
3. 替换Node.js内置模块的polyfill
虽然WebSocket模式下net/tls用不上,但SDK依赖的crypto模块需要浏览器端的polyfill。推荐用更现代的@rollup/plugin-node-polyfills替代旧的rollup-plugin-node-builtins:
首先安装依赖:
npm install @rollup/plugin-node-polyfills --save-dev
然后在配置里替换:
import nodePolyfills from '@rollup/plugin-node-polyfills'; // 在plugins数组中添加 nodePolyfills({ include: ['crypto'] // 只引入需要的polyfill,减少包体积 })
4. 用replace插件告知SDK运行在浏览器环境
aws-iot-device-sdk会根据环境变量调整行为,需要明确告诉它当前是浏览器环境:
replace({ 'process.env.NODE_ENV': JSON.stringify('production'), 'process.browser': true, // 关键配置,让SDK切换到浏览器兼容模式 preventAssignment: true })
5. 检查代码中的导入方式
确保你在业务代码里的导入是正确的,比如:
// 方式1:导入整个SDK import AWSIoT from 'aws-iot-device-sdk'; const device = AWSIoT.device({ /* 配置 */ }); // 方式2:解构导入需要的模块 import { device } from 'aws-iot-device-sdk'; const myDevice = device({ /* 配置 */ });
整合后的完整配置示例
import babel from 'rollup-plugin-babel'; import resolve from 'rollup-plugin-node-resolve'; import nodePolyfills from '@rollup/plugin-node-polyfills'; import uglify from 'rollup-plugin-uglify'; import commonjs from 'rollup-plugin-commonjs'; import async from 'rollup-plugin-async'; import json from 'rollup-plugin-json'; import replace from 'rollup-plugin-replace'; import globals from 'rollup-plugin-node-globals'; export default { input: 'src/index.js', output: { file: 'dist/bundle.js', format: 'iife', // 浏览器环境推荐用IIFE或UMD格式 name: 'MyIoTApplication', // 打包后的全局变量名 sourcemap: true }, plugins: [ replace({ 'process.env.NODE_ENV': JSON.stringify('production'), 'process.browser': true, preventAssignment: true }), resolve({ browser: true, // 优先查找模块的浏览器兼容版本 preferBuiltins: false }), commonjs({ include: 'node_modules/**', namedExports: { 'aws-iot-device-sdk': ['device', 'thingShadow', 'jobs'] } }), nodePolyfills({ include: ['crypto'] }), globals(), async(), json(), babel({ exclude: 'node_modules/**' }), uglify() ] };
内容的提问来源于stack exchange,提问作者Goran Gjorgievski
相关产品推荐
相关产品推荐

