Protobuf:未捕获的引用错误:未定义导出

时间:2017-05-31 14:13:15

标签: javascript typescript npm protocol-buffers

我试图让protobuf在打字稿中运行。

官方Google文档说只需使用npm install google-protobuf,然后使用require('google-protobuf')

我对npm缺乏经验,所以我遇到了几个问题。首先,require('google-protobuf')返回错误404,因为找不到该文件。我反而选择手动要求该文件,因此我在index.html

中提取了该文件
<script src="node_modules/google-protobuf/google-protobuf.js"></script>

这个应该正常工作吗? 相反,我得到的是Uncaught reference error: exports is not defined。我怎么开始调试这个?我试着看一下google-protobuf.js文件,发现了一些exports语句,但我不知道我在这里做了什么。

如果它有帮助,这是我的tsconfig.json文件:

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "moduleResolution": "node",
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "removeComments": false,
    "noImplicitAny": false
  },
  "exclude": [
    "node_modules",
    "typings/main",
    "typings/main.d.ts"
  ]
}

2 个答案:

答案 0 :(得分:1)

首先,请确保您拥有合适的环境。我建议你:

  1. 安装和/或更新节点
  2. 安装和/或更新 ts-node
  3. 然后,尝试以下解决方案:

    JavaScript(ES5)+ CommonJS

    // test.js
    var protobuf = require('google-protobuf');
    console.log(protobuf);
    

    使用node test.js运行脚本。

    TypeScript + ES6模块

    // test.ts
    import * as protobuf from 'google-protobuf';
    console.log(protobuf);
    

    使用ts-node test.ts运行脚本。

    如果您在终端中看到常规对象,恭喜!该模块正在运行。但现在,如果您想在浏览器中使用它,则需要模块加载器/捆绑器,如 Browserify Webpack ...

答案 1 :(得分:0)

你正在使用打字稿。尝试 import protobuf = reqquire('google-protobuf')

或通过npm install @types/google-protobuf'安装类型,并将其包含在import * as protobuf from 'google-protobuf'

HTML中的include不起作用,因为js文件使用导入并且依赖关系未解析。

如果你想在客户端使用它,你最终可以使用browserify构建你的前端js文件。