annotate xml/en/docs/njs/node_modules.xml @ 2576:4c8d0b37932d

Corrected syntax and style of "Using node modules with njs".
author Yaroslav Zhuravlev <yar@nginx.com>
date Thu, 06 Aug 2020 14:46:58 +0100
parents bda080989b6c
children fca42223b9fc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2480
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1 <?xml version="1.0"?>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
2
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
3 <!--
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
4 Copyright (C) Nginx, Inc.
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
5 -->
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
6
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
7 <!DOCTYPE article SYSTEM "../../../../dtd/article.dtd">
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
8
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
9 <article name="Using node modules with njs"
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
10 link="/en/docs/njs/node_modules.html"
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
11 lang="en"
2576
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
12 rev="4">
2480
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
13
2576
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
14 <section id="intro">
2480
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
15
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
16 <para>
2576
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
17 Often, a developer wants to use 3rd-party code,
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
18 usually available as a library of some kind.
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
19 In the JavaScript world, the concept of a module is relatively new,
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
20 so there was no standard until recently.
2480
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
21 Many platforms (browsers) still don't support modules, which makes code
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
22 reuse harder.
2576
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
23 This article describes ways to reuse
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
24 <link url="https://nodejs.org/">Node.js</link> code in njs.
2480
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
25 </para>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
26
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
27 <note>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
28 Examples in this article use features that appeared in
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
29 <link doc="index.xml">njs</link>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
30 <link doc="changes.xml" id="njs0.3.8">0.3.8</link>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
31 </note>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
32
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
33 <para>
2576
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
34 There is a number of issues
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
35 that may arise when 3rd-party code is added to njs:
2480
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
36
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
37 <list type="bullet">
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
38
2576
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
39 <listitem>
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
40 Multiple files that reference each other and their dependencies
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
41 </listitem>
2480
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
42
2576
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
43 <listitem>
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
44 Platform-specific APIs
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
45 </listitem>
2480
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
46
2576
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
47 <listitem>
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
48 Modern standard language constructions
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
49 </listitem>
2480
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
50
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
51 </list>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
52 </para>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
53
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
54 <para>
2576
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
55 The good news is that such problems are not something new or specific to njs.
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
56 JavaScript developers face them daily
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
57 when trying to support multiple disparate platforms
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
58 with very different properties.
2480
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
59 There are instruments designed to resolve the above-mentioned issues.
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
60
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
61 <list type="bullet">
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
62
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
63 <listitem>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
64 Multiple files that reference each other, and their dependencies
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
65 <para>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
66 This can be solved by merging all the interdependent code into a single file.
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
67 Tools like
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
68 <link url="http://browserify.org/">browserify</link> or
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
69 <link url="https://webpack.js.org/">webpack</link>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
70 accept an entire project and produce a single file containing
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
71 your code and all the dependencies.
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
72 </para>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
73 </listitem>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
74
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
75 <listitem>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
76 Platform-specific APIs
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
77 <para>
2576
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
78 You can use multiple libraries that implement such APIs
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
79 in a platform-agnostic manner (at the expense of performance, though).
2480
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
80 Particular features can also be implemented using the
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
81 <link url="https://polyfill.io/v3/">polyfill</link> approach.
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
82 </para>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
83 </listitem>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
84
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
85 <listitem>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
86 Modern standard language constructions
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
87 <para>
2576
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
88 Such code can be transpiled:
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
89 this means performing a number of transformations
2480
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
90 that rewrite newer language features in accordance with an older standard.
2576
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
91 For example, <link url="https://babeljs.io/"> babel</link> project
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
92 can be used to this purpose.
2480
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
93 </para>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
94 </listitem>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
95
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
96 </list>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
97 </para>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
98
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
99 <para>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
100 In this guide, we will use two relatively large npm-hosted libraries:
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
101
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
102 <list type="bullet">
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
103
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
104 <listitem>
2576
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
105 <link url="https://www.npmjs.com/package/protobufjs">protobufjs</link>&mdash;
2480
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
106 a library for creating and parsing protobuf messages used by the
2576
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
107 <link url="https://grpc.io/">gRPC</link> protocol
2480
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
108 </listitem>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
109
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
110 <listitem>
2576
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
111 <link url="https://www.npmjs.com/package/dns-packet">dns-packet</link>&mdash;
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
112 a library for processing DNS protocol packets
2480
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
113 </listitem>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
114
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
115 </list>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
116 </para>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
117
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
118 </section>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
119
2576
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
120
2480
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
121 <section id="environment" name="Environment">
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
122
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
123 <para>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
124 <note>
2576
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
125 This document mostly employs a generic approach
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
126 and avoids specific best practice advices concerning Node.js
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
127 and JavaScript.
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
128 Make sure to consult the corresponding package's manual
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
129 before following the steps suggested here.
2480
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
130 </note>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
131 First (assuming Node.js is installed and operational), let's create an
2576
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
132 empty project and install some dependencies;
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
133 the commands below assume we are in the working directory:
2480
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
134 <example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
135 $ mkdir my_project &amp;&amp; cd my_project
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
136 $ npx license choose_your_license_here > LICENSE
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
137 $ npx gitignore node
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
138
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
139 $ cat &gt; package.json &lt;&lt;EOF
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
140 {
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
141 "name": "foobar",
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
142 "version": "0.0.1",
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
143 "description": "",
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
144 "main": "index.js",
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
145 "keywords": [],
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
146 "author": "somename &lt;some.email@example.com&gt; (https://example.com)",
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
147 "license": "some_license_here",
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
148 "private": true,
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
149 "scripts": {
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
150 "test": "echo \"Error: no test specified\" &amp;&amp; exit 1"
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
151 }
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
152 }
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
153 EOF
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
154 $ npm init -y
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
155 $ npm install browserify
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
156 </example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
157 </para>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
158
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
159 </section>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
160
2576
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
161
2481
8ed243471444 Typos fixed.
Vladimir Homutov <vl@nginx.com>
parents: 2480
diff changeset
162 <section id="protobuf" name="Protobufjs">
2480
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
163
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
164 <para>
2576
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
165 The library provides a parser
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
166 for the <literal>.proto</literal> interface definitions
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
167 and a code generator for message parsing and generation.
2480
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
168 </para>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
169
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
170 <para>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
171 In this example, we will use the
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
172 <link url="https://github.com/grpc/grpc/blob/master/examples/protos/helloworld.proto">helloworld.proto</link>
2576
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
173 file
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
174 from the gRPC examples.
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
175 Our goal is to create two messages:
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
176 <literal>HelloRequest</literal> and
2480
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
177 <literal>HelloResponse</literal>.
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
178 We will use the
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
179 <link url="https://github.com/protobufjs/protobuf.js/blob/master/README.md#reflection-vs-static-code">static</link>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
180 mode of protobufjs instead of dynamically generating classes, because
2576
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
181 njs doesn't support adding new functions dynamically
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
182 due to security considerations.
2480
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
183 </para>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
184
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
185 <para>
2576
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
186 Next, the library is installed and
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
187 the JavaScript code implementing message marshalling
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
188 is generated from the protocol definition:
2480
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
189 <example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
190 $ npm install protobufjs
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
191 $ npx pbjs -t static-module helloworld.proto > static.js
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
192 </example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
193 </para>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
194
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
195 <para>
2576
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
196 Thus, the <literal>static.js</literal> file becomes our new dependency,
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
197 storing all the code we need to implement message processing.
2480
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
198 The <literal>set_buffer()</literal> function contains code that uses the
2576
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
199 library to create a buffer with the serialized
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
200 <literal>HelloRequest</literal> message.
2480
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
201 The code resides in the <literal>code.js</literal> file:
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
202 <example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
203 var pb = require('./static.js');
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
204
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
205 // Example usage of protobuf library: prepare a buffer to send
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
206 function set_buffer(pb)
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
207 {
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
208 // set fields of gRPC payload
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
209 var payload = { name: "TestString" };
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
210
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
211 // create an object
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
212 var message = pb.helloworld.HelloRequest.create(payload);
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
213
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
214 // serialize object to buffer
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
215 var buffer = pb.helloworld.HelloRequest.encode(message).finish();
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
216
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
217 var n = buffer.length;
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
218
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
219 var frame = new Uint8Array(5 + buffer.length);
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
220
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
221 frame[0] = 0; // 'compressed' flag
2576
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
222 frame[1] = (n &amp; 0xFF000000) &gt;&gt;&gt; 24; // length: uint32 in network byte order
2480
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
223 frame[2] = (n &amp; 0x00FF0000) &gt;&gt;&gt; 16;
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
224 frame[3] = (n &amp; 0x0000FF00) &gt;&gt;&gt; 8;
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
225 frame[4] = (n &amp; 0x000000FF) &gt;&gt;&gt; 0;
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
226
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
227 frame.set(buffer, 5);
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
228
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
229 return frame;
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
230 }
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
231
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
232 var frame = set_buffer(pb);
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
233 </example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
234 </para>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
235
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
236 <para>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
237 To ensure it works, we execute the code using node:
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
238 <example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
239 $ node ./code.js
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
240 Uint8Array [
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
241 0, 0, 0, 0, 12, 10,
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
242 10, 84, 101, 115, 116, 83,
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
243 116, 114, 105, 110, 103
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
244 ]
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
245 </example>
2481
8ed243471444 Typos fixed.
Vladimir Homutov <vl@nginx.com>
parents: 2480
diff changeset
246 You can see that this got us a properly encoded <literal>gRPC</literal> frame.
2480
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
247 Now let's run it with njs:
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
248 <example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
249 $ njs ./code.js
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
250 Thrown:
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
251 Error: Cannot find module "./static.js"
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
252 at require (native)
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
253 at main (native)
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
254 </example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
255 </para>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
256
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
257 <para>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
258 Modules are not supported, so we've received an exception.
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
259 To overcome this issue, let's use <literal>browserify</literal>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
260 or other similar tool.
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
261 </para>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
262
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
263 <para>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
264 An attempt to process our existing <literal>code.js</literal> file will result
2576
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
265 in a bunch of JS code that is supposed to run in a browser,
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
266 i.e. immediately upon loading.
2480
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
267 This isn't something we actually want.
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
268 Instead, we want to have an exported function that
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
269 can be referenced from the nginx configuration.
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
270 This requires some wrapper code.
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
271 <note>
2576
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
272 In this guide, we use
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
273 njs <link doc="cli.xml">cli</link> in all examples for the sake of simplicity.
2480
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
274 In real life, you will be using nginx njs module to run your code.
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
275 </note>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
276 </para>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
277
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
278 <para>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
279 The <literal>load.js</literal> file contains the library-loading code that
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
280 stores its handle in the global namespace:
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
281 <example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
282 global.hello = require('./static.js');
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
283 </example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
284 This code will be replaced with merged content.
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
285 Our code will be using the "<literal>global.hello</literal>" handle to access
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
286 the library.
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
287 </para>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
288
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
289 <para>
2576
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
290 Next, we process it with <literal>browserify</literal>
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
291 to get all dependencies into a single file:
2480
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
292 <example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
293 $ npx browserify load.js -o bundle.js -d
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
294 </example>
2576
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
295 The result is a huge file that contains all our dependencies:
2480
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
296 <example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
297 (function(){function......
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
298 ...
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
299 ...
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
300 },{"protobufjs/minimal":9}]},{},[1])
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
301 //# sourceMappingURL..............
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
302 </example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
303 To get final "<literal>njs_bundle.js</literal>" file we concatenate
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
304 "<literal>bundle.js</literal>" and the following code:
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
305 <example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
306 // Example usage of protobuf library: prepare a buffer to send
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
307 function set_buffer(pb)
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
308 {
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
309 // set fields of gRPC payload
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
310 var payload = { name: "TestString" };
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
311
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
312 // create an object
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
313 var message = pb.helloworld.HelloRequest.create(payload);
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
314
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
315 // serialize object to buffer
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
316 var buffer = pb.helloworld.HelloRequest.encode(message).finish();
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
317
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
318 var n = buffer.length;
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
319
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
320 var frame = new Uint8Array(5 + buffer.length);
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
321
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
322 frame[0] = 0; // 'compressed' flag
2576
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
323 frame[1] = (n &amp; 0xFF000000) &gt;&gt;&gt; 24; // length: uint32 in network byte order
2480
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
324 frame[2] = (n &amp; 0x00FF0000) &gt;&gt;&gt; 16;
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
325 frame[3] = (n &amp; 0x0000FF00) &gt;&gt;&gt; 8;
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
326 frame[4] = (n &amp; 0x000000FF) &gt;&gt;&gt; 0;
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
327
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
328 frame.set(buffer, 5);
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
329
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
330 return frame;
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
331 }
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
332
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
333 // functions to be called from outside
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
334 function setbuf()
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
335 {
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
336 return set_buffer(global.hello);
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
337 }
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
338
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
339 // call the code
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
340 var frame = setbuf();
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
341 console.log(frame);
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
342 </example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
343 Let's run the file using node to make sure things still work:
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
344 <example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
345 $ node ./njs_bundle.js
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
346 Uint8Array [
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
347 0, 0, 0, 0, 12, 10,
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
348 10, 84, 101, 115, 116, 83,
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
349 116, 114, 105, 110, 103
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
350 ]
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
351 </example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
352 Now let's proceed further with njs:
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
353 <example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
354 $ /njs ./njs_bundle.js
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
355 Uint8Array [0,0,0,0,12,10,10,84,101,115,116,83,116,114,105,110,103]
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
356 </example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
357 The last thing will be to use njs-specific API to convert
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
358 array into byte string, so it could be usable by nginx module.
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
359 We can add the following snippet before the last line:
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
360 <example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
361 if (global.njs) {
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
362 return String.bytesFrom(frame)
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
363 }
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
364 </example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
365 Finally, we got it working:
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
366 <example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
367 $ njs ./njs_bundle.js |hexdump -C
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
368 00000000 00 00 00 00 0c 0a 0a 54 65 73 74 53 74 72 69 6e |.......TestStrin|
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
369 00000010 67 0a |g.|
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
370 00000012
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
371 </example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
372 This is the intended result.
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
373 Response parsing can be implemented similarly:
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
374 <example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
375 function parse_msg(pb, msg)
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
376 {
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
377 // convert byte string into integer array
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
378 var bytes = msg.split('').map(v=>v.charCodeAt(0));
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
379
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
380 if (bytes.length &lt; 5) {
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
381 throw 'message too short';
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
382 }
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
383
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
384 // first 5 bytes is gRPC frame (compression + length)
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
385 var head = bytes.splice(0, 5);
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
386
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
387 // ensure we have proper message length
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
388 var len = (head[1] &lt;&lt; 24)
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
389 + (head[2] &lt;&lt; 16)
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
390 + (head[3] &lt;&lt; 8)
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
391 + head[4];
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
392
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
393 if (len != bytes.length) {
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
394 throw 'header length mismatch';
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
395 }
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
396
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
397 // invoke protobufjs to decode message
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
398 var response = pb.helloworld.HelloReply.decode(bytes);
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
399
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
400 console.log('Reply is:' + response.message);
2489
bda080989b6c Fixed indentation and braces in njs example.
Vladimir Homutov <vl@nginx.com>
parents: 2481
diff changeset
401 }
2480
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
402 </example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
403 </para>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
404
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
405 </section>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
406
2576
4c8d0b37932d Corrected syntax and style of "Using node modules with njs".
Yaroslav Zhuravlev <yar@nginx.com>
parents: 2489
diff changeset
407
2480
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
408 <section id="dnspacket" name="DNS-packet">
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
409
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
410 <para>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
411 This example uses a library for generation and parsing of DNS packets.
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
412 This a case worth considering because the library and its dependencies
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
413 use modern language constructions not yet supported by njs.
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
414 In turn, this requires from us an extra step: transpiling the source code.
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
415 </para>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
416
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
417 <para>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
418 Additional node packages are needed:
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
419 <example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
420 $ npm install @babel/core @babel/cli @babel/preset-env babel-loader
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
421 $ npm install webpack webpack-cli
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
422 $ npm install buffer
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
423 $ npm install dns-packet
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
424 </example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
425 The configuration file, webpack.config.js:
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
426 <example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
427 const path = require('path');
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
428
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
429 module.exports = {
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
430 entry: './load.js',
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
431 mode: 'production',
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
432 output: {
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
433 filename: 'wp_out.js',
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
434 path: path.resolve(__dirname, 'dist'),
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
435 },
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
436 optimization: {
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
437 minimize: false
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
438 },
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
439 node: {
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
440 global: true,
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
441 },
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
442 module : {
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
443 rules: [{
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
444 test: /\.m?js$$/,
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
445 exclude: /(bower_components)/,
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
446 use: {
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
447 loader: 'babel-loader',
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
448 options: {
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
449 presets: ['@babel/preset-env']
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
450 }
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
451 }
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
452 }]
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
453 }
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
454 };
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
455 </example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
456 Note we are using "<literal>production</literal>" mode.
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
457 In this mode webpack does not use "<literal>eval</literal>" construction
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
458 not supported by njs.
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
459 The referenced <literal>load.js</literal> file is our entry point:
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
460 <example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
461 global.dns = require('dns-packet')
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
462 global.Buffer = require('buffer/').Buffer
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
463 </example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
464 We start the same way, by producing a single file for the libraries:
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
465 <example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
466 $ npx browserify load.js -o bundle.js -d
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
467 </example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
468 Next, we process the file with webpack, which itself invokes babel:
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
469 <example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
470 $ npx webpack --config webpack.config.js
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
471 </example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
472 This command produces the <literal>dist/wp_out.js</literal> file, which is a
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
473 transpiled version of <literal>bundle.js</literal>.
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
474 We need to concatenate it with <literal>code.js</literal>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
475 that stores our code:
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
476 <example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
477 function set_buffer(dnsPacket)
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
478 {
2489
bda080989b6c Fixed indentation and braces in njs example.
Vladimir Homutov <vl@nginx.com>
parents: 2481
diff changeset
479 // create DNS packet bytes
bda080989b6c Fixed indentation and braces in njs example.
Vladimir Homutov <vl@nginx.com>
parents: 2481
diff changeset
480 var buf = dnsPacket.encode({
bda080989b6c Fixed indentation and braces in njs example.
Vladimir Homutov <vl@nginx.com>
parents: 2481
diff changeset
481 type: 'query',
bda080989b6c Fixed indentation and braces in njs example.
Vladimir Homutov <vl@nginx.com>
parents: 2481
diff changeset
482 id: 1,
bda080989b6c Fixed indentation and braces in njs example.
Vladimir Homutov <vl@nginx.com>
parents: 2481
diff changeset
483 flags: dnsPacket.RECURSION_DESIRED,
bda080989b6c Fixed indentation and braces in njs example.
Vladimir Homutov <vl@nginx.com>
parents: 2481
diff changeset
484 questions: [{
bda080989b6c Fixed indentation and braces in njs example.
Vladimir Homutov <vl@nginx.com>
parents: 2481
diff changeset
485 type: 'A',
bda080989b6c Fixed indentation and braces in njs example.
Vladimir Homutov <vl@nginx.com>
parents: 2481
diff changeset
486 name: 'google.com'
bda080989b6c Fixed indentation and braces in njs example.
Vladimir Homutov <vl@nginx.com>
parents: 2481
diff changeset
487 }]
bda080989b6c Fixed indentation and braces in njs example.
Vladimir Homutov <vl@nginx.com>
parents: 2481
diff changeset
488 })
2480
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
489
2489
bda080989b6c Fixed indentation and braces in njs example.
Vladimir Homutov <vl@nginx.com>
parents: 2481
diff changeset
490 return buf;
2480
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
491 }
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
492 </example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
493 Note that in this example generated code is not wrapped into function and we
2481
8ed243471444 Typos fixed.
Vladimir Homutov <vl@nginx.com>
parents: 2480
diff changeset
494 do not need to call it explicitly.
8ed243471444 Typos fixed.
Vladimir Homutov <vl@nginx.com>
parents: 2480
diff changeset
495 The result is in the "<literal>dist</literal>" directory:
2480
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
496 <example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
497 $ cat dist/wp_out.js code.js > njs_dns_bundle.js
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
498 </example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
499 Let's call our code at the end of a file:
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
500 <example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
501 var b = setbuf(1);
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
502 console.log(b);
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
503 </example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
504 And execute it using node:
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
505 <example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
506 $ node ./njs_dns_bundle_final.js
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
507 Buffer [Uint8Array] [
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
508 0, 1, 1, 0, 0, 1, 0, 0,
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
509 0, 0, 0, 0, 6, 103, 111, 111,
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
510 103, 108, 101, 3, 99, 111, 109, 0,
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
511 0, 1, 0, 1
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
512 ]
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
513 </example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
514 Make sure this works as expected, and then run it with njs:
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
515 <example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
516 $ njs ./njs_dns_bundle_final.js
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
517 Uint8Array [0,1,1,0,0,1,0,0,0,0,0,0,6,103,111,111,103,108,101,3,99,111,109,0,0,1,0,1]
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
518 </example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
519
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
520 </para>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
521
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
522 <para>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
523 The response can be parsed as follows:
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
524 <example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
525 function parse_response(buf)
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
526 {
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
527 var bytes = buf.split('').map(v=>v.charCodeAt(0));
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
528
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
529 var b = global.Buffer.from(bytes);
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
530
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
531 var packet = dnsPacket.decode(b);
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
532
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
533 var resolved_name = packet.answers[0].name;
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
534
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
535 // expected name is 'google.com', according to our request above
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
536 }
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
537 </example>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
538 </para>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
539
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
540 </section>
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
541
73d254c3376d Added the "Using node modules with njs" article.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
542 </article>