grpc-tools provides essential development tools for working with gRPC in Node.js environments. It distributes the Protocol Buffers compiler (protoc) along with a specialized plugin for generating client and service objects compatible with Node gRPC libraries.
npm install --save-dev grpc-tools (typically as dev dependency)grpc-tools is primarily a command-line tool, but exports an empty object from its main module:
const grpcTools = require("grpc-tools");
// grpcTools is {} - use CLI commands insteadgrpc-tools provides two main command-line executables for working with Protocol Buffers and gRPC:
# Generate JavaScript and gRPC files from proto definitions
grpc_tools_node_protoc \
--js_out=import_style=commonjs,binary:./generated \
--grpc_out=grpc_js:./generated \
--plugin=protoc-gen-grpc=`which grpc_tools_node_protoc_plugin` \
path/to/service.proto
# The plugin is automatically included, so this works too:
grpc_tools_node_protoc \
--js_out=import_style=commonjs,binary:./generated \
--grpc_out=grpc_js:./generated \
service.protogrpc-tools consists of several key components:
protoc binary for compiling .proto filesCore protoc functionality for compiling .proto files into JavaScript with full protoc feature support.
grpc_tools_node_protoc [protoc_options] [proto_files...]
# Standard protoc options supported:
# --js_out=import_style=commonjs,binary:OUTPUT_DIR
# --proto_path=IMPORT_PATHS
# --descriptor_set_out=FILE
# And all other standard protoc optionsAvailable import styles for --js_out:
commonjs: CommonJS module format (default)closure: Google Closure Library formatbinary: Include binary serialization/deserialization supportGenerates Node.js gRPC client and service code from .proto service definitions.
grpc_tools_node_protoc --grpc_out=[option:]OUTPUT_DIR [proto_files...]
# Available grpc_out options:
# grpc_js: Use @grpc/grpc-js library (recommended)
# generate_package_definition: Generate PackageDefinition objects
# omit_serialize_instanceof: Skip instanceof checks for messagesgrpc_js option (recommended):
grpc_tools_node_protoc --grpc_out=grpc_js:./generated service.protogenerate_package_definition option:
grpc_tools_node_protoc --grpc_out=generate_package_definition:./generated service.protoomit_serialize_instanceof option:
grpc_tools_node_protoc --grpc_out=omit_serialize_instanceof:./generated service.protoStandalone gRPC plugin execution for use with external protoc installations.
grpc_tools_node_protoc_plugin
# Used as protoc plugin:
protoc --plugin=protoc-gen-grpc=grpc_tools_node_protoc_plugin \
--grpc_out=./generated \
service.protoIncludes standard Google protobuf definitions available for import in .proto files.
// Available well-known types:
import "google/protobuf/any.proto";
import "google/protobuf/api.proto";
import "google/protobuf/compiler/plugin.proto";
import "google/protobuf/descriptor.proto";
import "google/protobuf/duration.proto";
import "google/protobuf/empty.proto";
import "google/protobuf/field_mask.proto";
import "google/protobuf/source_context.proto";
import "google/protobuf/struct.proto";
import "google/protobuf/timestamp.proto";
import "google/protobuf/type.proto";
import "google/protobuf/wrappers.proto";The main module exports an empty object - the package is designed for CLI usage.
/**
* Main module export (empty object)
* Use CLI commands instead of programmatic API
*/
module.exports = {};# Generate JavaScript and gRPC files for the modern gRPC library
grpc_tools_node_protoc \
--js_out=import_style=commonjs,binary:./proto \
--grpc_out=grpc_js:./proto \
protos/helloworld.proto# Compile multiple protos with custom import paths
grpc_tools_node_protoc \
--proto_path=./protos \
--proto_path=./vendor/protos \
--js_out=import_style=commonjs,binary:./generated \
--grpc_out=grpc_js:./generated \
user.proto order.proto inventory.proto# Generate PackageDefinition objects for use with loadPackageDefinition
grpc_tools_node_protoc \
--js_out=import_style=commonjs,binary:./proto \
--grpc_out=generate_package_definition:./proto \
service.proto
# Use in Node.js:
# const packageDefinition = require('./proto/service_grpc_pb.js');
# const grpc = require('@grpc/grpc-js');
# const protoLoader = require('@grpc/proto-loader');
# const serviceProto = grpc.loadPackageDefinition(packageDefinition);syntax = "proto3";
import "google/protobuf/timestamp.proto";
import "google/protobuf/empty.proto";
service TimeService {
rpc GetCurrentTime(google.protobuf.Empty) returns (google.protobuf.Timestamp);
}{
"scripts": {
"proto:generate": "grpc_tools_node_protoc --js_out=import_style=commonjs,binary:./src/proto --grpc_out=grpc_js:./src/proto --proto_path=./protos protos/*.proto",
"proto:clean": "rm -rf ./src/proto/*"
}
}# Pre-build step in CI/CD
npm run proto:generate
npm test
npm run buildgrpc-tools executables will exit with non-zero status codes on compilation errors:
Common error scenarios:
--proto_path includes all import directories