部分npm包解析子依赖失败求助——以googleapis为例
问题:Ember项目构建时googleapis包依赖解析失败
部分npm包在构建过程中解析传递依赖时出错,其中googleapis包出现了该问题。
我的ember-cli-build.js代码:
app.import('node_modules/googleapis/build/src/index.js', { using: [{ transformation: 'cjs', as: 'googleapis' }], });
构建时的错误输出:
Unexpected token ... 'fs' 被 node_modules/google-auth-library/build/src/auth/googleauth.js 引入,但无法解析 —— 视为外部依赖 'fs' 被 commonjs-external:fs 引入,但无法解析 —— 视为外部依赖 'url' 被 commonjs-external:url 引入,但无法解析 —— 视为外部依赖 'util' 被 node_modules/lru-cache/index.js 引入,但无法解析 —— 视为外部依赖 'util' 被 node_modules/google-auth-library/build/src/auth/googleauth.js 引入,但无法解析 —— 视为外部依赖 'util' 被 commonjs-external:util 引入,但无法解析 —— 视为外部依赖 'stream' 被 node_modules/google-auth-library/build/src/auth/oauth2client.js 引入,但无法解析 —— 视为外部依赖 'stream' 被 commonjs-external:stream 引入,但无法解析 —— 视为外部依赖 'stream' 被 node_modules/jws/lib/sign-stream.js 引入,但无法解析 —— 视为外部依赖 'stream' 被 node_modules/jws/lib/verify-stream.js 引入,但无法解析 —— 视为外部依赖 'stream' 被 node_modules/jws/lib/data-stream.js 引入,但无法解析 —— 视为外部依赖 'util' 被 node_modules/jws/lib/sign-stream.js 引入,但无法解析 —— 视为外部依赖 'util' 被 node_modules/jws/lib/verify-stream.js 引入,但无法解析 —— 视为外部依赖 'util' 被 node_modules/jws/lib/data-stream.js 引入,但无法解析 —— 视为外部依赖 'fs' 被 node_modules/gtoken/build/src/index.js 引入,但无法解析 —— 视为外部依赖 ... 还有更多类似错误...
解决办法
核心原因:googleapis是Node.js专属包
googleapis专为Node.js环境开发,依赖fs、stream等Node核心模块,这些模块在浏览器环境中不存在,直接引入必然出错。改用浏览器兼容的Google API方案
- 直接调用Google官方提供的REST API,用
fetch或Ember的ember-fetch发起请求,无需引入整个googleapis包。 - 如果需要处理授权,使用Google OAuth 2.0的前端实现方案,或使用
google-auth-library的浏览器适配版本,不要引入完整的googleapis。
- 临时适配方案(不推荐)
如果必须用现有包,可通过polyfill Node核心模块来规避解析错误,但无法解决功能兼容问题:
- 安装依赖:
npm install ember-browserify stream-browserify util-browserify --save-dev - 修改ember-cli-build.js:
const EmberApp = require('ember-cli/lib/broccoli/ember-app'); module.exports = function(defaults) { let app = new EmberApp(defaults, { browserify: { shim: { 'fs': { path: 'false', exports: null }, 'stream': { path: 'stream-browserify', exports: 'Stream' }, 'util': { path: 'util-browserify' } } } }); // 移除原来的app.import语句,改用browserify引入 app.import('node_modules/googleapis/build/src/index.js', { using: [{ transformation: 'cjs', as: 'googleapis' }], browserify: true }); return app.toTree(); };
内容的提问来源于stack exchange,提问作者Captain America
相关产品推荐
相关产品推荐

