# HG changeset patch # User Yaroslav Zhuravlev # Date 1685635938 -3600 # Node ID cc475ba7d406e45873baa126f8361fc1f4e75316 # Parent 67dd348c97574eb9058578a3c3f6293040056379 Added Preload Objects article in njs. diff --git a/xml/en/GNUmakefile b/xml/en/GNUmakefile --- a/xml/en/GNUmakefile +++ b/xml/en/GNUmakefile @@ -137,6 +137,7 @@ REFS = \ njs/cli \ njs/compatibility \ njs/install \ + njs/preload_objects \ njs/reference \ njs/security \ njs/node_modules \ diff --git a/xml/en/docs/njs/index.xml b/xml/en/docs/njs/index.xml --- a/xml/en/docs/njs/index.xml +++ b/xml/en/docs/njs/index.xml @@ -9,7 +9,7 @@
@@ -62,6 +62,10 @@ The compliance is still + + + Tested OS and platforms diff --git a/xml/en/docs/njs/preload_objects.xml b/xml/en/docs/njs/preload_objects.xml new file mode 100644 --- /dev/null +++ b/xml/en/docs/njs/preload_objects.xml @@ -0,0 +1,78 @@ + + + + + + +
+ +
+ + +For each incoming request njs creates a separate virtual machine. +This brings a lot of benefits such as predictable memory consumption +or requests isolation. + + + +However, it also has its own downsides. +Since all requests are isolated, +if a request handler needs to access some data, +it has to read it by itself. +This is not efficient especially when the amount of data is large. + + + +To address this limitation, +a preloaded shared object was introduced. +Such objects are created immutable and do not have prototype chains: +their values cannot be changed, properties cannot be added or removed. + + +
+ + +
+ + +Here are some examples of how to work with a preload object in njs: + + + + +access properties by name: + +preloaded_object.prop_name +preloaded_object[prop_name] + + + + +enumerate properties: + +for (i in preloaded_object_name) { + ... +} + + + + +apply non-modifying built-in methods using call(): + +Array.prototype.filter.call(preloaded_object_name, ...) + + + + + + +
+ +
diff --git a/xml/ru/GNUmakefile b/xml/ru/GNUmakefile --- a/xml/ru/GNUmakefile +++ b/xml/ru/GNUmakefile @@ -120,6 +120,7 @@ REFS = \ njs/compatibility \ njs/install \ njs/node_modules \ + njs/preload_objects \ njs/typescript \ TOP = \ diff --git a/xml/ru/docs/njs/index.xml b/xml/ru/docs/njs/index.xml --- a/xml/ru/docs/njs/index.xml +++ b/xml/ru/docs/njs/index.xml @@ -9,7 +9,7 @@
@@ -22,8 +22,7 @@ njs совместим с (строгий режим) c некоторыми расширениями ECMAScript 6 и позже. -Совместимость находится в стадии -развития. +Совместимость находится в стадии развития.
@@ -51,6 +50,10 @@ njs совместим с + + + + @@ -59,6 +62,10 @@ njs совместим с + + + + Протестированные ОС и платформы diff --git a/xml/ru/docs/njs/preload_objects.xml b/xml/ru/docs/njs/preload_objects.xml new file mode 100644 --- /dev/null +++ b/xml/ru/docs/njs/preload_objects.xml @@ -0,0 +1,80 @@ + + + + + + +
+ +
+ + +Для каждого входящего запроса в njs создаётся отдельная виртуальная машина. +Это позволяет прогнозировать предсказуемое поглощение памяти +или осуществить изоляцию запросов. + + + +Однако у такого подхода есть недостатки. +Поскольку все запросы являются изолированными, то +если обработчику запроса необходимо получить доступ к данным, +ему нужно сначала их прочитать самому. +Это неэффективно, особенно если объём данных большой. + + + +Это ограничение можно обойти +при помощи разделяемого предзагруженного объекта. +Такие объекты создаются неизменяемыми и не имеют цепочки прототипов: +у них нет возможности +изменить значения или добавить/удалить свойства в объектах/массивах. + + +
+ + +
+ + +Примеры работы с предзагруженными объектами в njs: + + + + +доступ к свойствам по имени: + +preloaded_object.prop_name +preloaded_object[prop_name] + + + + +перечисление свойств: + +for (i in preloaded_object_name) { + ... +} + + + + +применение встроенных методов, не изменяющих состояние, +при помощи call(): + +Array.prototype.filter.call(preloaded_object_name, ...) + + + + + + +
+ +