Skip to content

Commit

Permalink
Add next plus react advanced
Browse files Browse the repository at this point in the history
  • Loading branch information
Andrey Melikhov committed May 5, 2020
1 parent cec558b commit d8dd989
Show file tree
Hide file tree
Showing 55 changed files with 28,764 additions and 0 deletions.
13 changes: 13 additions & 0 deletions nest-react-advanced/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
FROM alpine:latest

RUN apk add --update nginx && rm -rf /var/cache/apk/*
COPY config/nginx.conf /etc/nginx/nginx.conf
COPY config/vhost.conf /etc/nginx/conf.d/vhost.conf

# forward request and error logs to docker log collector
RUN ln -svf /dev/stdout /var/log/nginx/access.log \
&& ln -svf /dev/stderr /var/log/nginx/error.log

EXPOSE 80 443

CMD ["nginx", "-g", "daemon off;"]
2 changes: 2 additions & 0 deletions nest-react-advanced/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Пример продвинутного приложения nest + react.
Видео: https://youtu.be/MP6NYi6UC8M
21 changes: 21 additions & 0 deletions nest-react-advanced/config/nginx.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
user nginx;
worker_processes 1;
pid /run/nginx.pid;

events {
worker_connections 512;
}

http {
sendfile off;
keepalive_timeout 10;
server_tokens off;

include /etc/nginx/mime.types;
default_type application/octet-stream;

access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;

include /etc/nginx/conf.d/*.conf;
}
20 changes: 20 additions & 0 deletions nest-react-advanced/config/vhost.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
upstream backend {
server host.docker.internal:3000;
}

server {
listen 80;
server_name 127.0.0.1;
root /www/public;

location / {
try_files $uri @backend;
}

location @backend {
proxy_pass http://backend;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

Large diffs are not rendered by default.

Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@

# Пишем производительный JavaScript. 3 совета.
![](https://cdn-images-1.medium.com/max/1600/1*CV60sHknbBWu54ydmw9XCg.jpeg)
Эта статья основана на советах [Бенедикта Маурера](https://twitter.com/bmeurer), встреченных мной в статьях, комментариях и лекциях. Почему эта информация интересна и важна? Бенедикт принимает непосредственное участие в разработке V8 и досконально знает, как именно интерпретатор и компилятор обрабатывают наш код.

---

## Помогите JavaScript понять, что на самом деле вы хотите сделать
Избегайте неопределённости. Например, если у вас есть значение `obj`, которое может быть `undefined` или объектом, рассмотрите возможность исключения неопределенности через явное условие:

```javascript
if (obj !== undefined) {
//
}
```

Тогда компилятору не придётся делать множество лишних проверок, как в случае, если вы напишите:

```javascript
if (obj) {
//
}
```

Что должен сделать компилятор в этом случае? Проверить, что `obj` не является пустой строкой, `false`, `0` или `undefined`. Всё это порождает лишние проверки в байткоде. Кажется, достаточно понимать, что перед нами объект, а объект всегда возвращает **true** на `toBoolean`. Но, к сожалению, в нашем динамически типизируемом языке компилятору придётся следить за всем циклом жизни переменной `obj`, чтобы убедиться, что на вход условия действительно пришёл объект.

![](https://cdn-images-1.medium.com/max/2000/1*0my1ZiCSFkinC6HB5eY4Fw.png)
*Первый вариант в среднем на 15% быстрее*

Дополнительная польза: когда вы будете читать свой код через год (или это будет делать кто-то другой), вам будет гораздо проще понять, что на самом деле проверяет ваше условие.

## Осторожнее с `&&` и `||`
![](https://cdn-images-1.medium.com/max/1600/1*8CZN4PG7s565SftA60yWCw.png)
*[https://github.com/developit/preact/pull/610](https://github.com/developit/preact/pull/610)*

Это пример из реального коммита в репозитории preact. Изменение логического выражения на тернарный оператор сделано для повышения производительности кода (автор сообщает об 1–5% ускорении). Но за счёт чего?

Мы помогли компилятору, указав, что значением `vlen` всегда будет `Number`. В негативном сценарии первого случая мы получим тип `Boolean` для `vlen`, что и приводит к деоптимизации, а так же добавляет ещё одну дорогостоящую проверку позже, чтобы убедиться, что `vlen` на самом деле число.

Воспользовавшись советом из первой части статьи, можно получить дополнительное ускорение:

```javascript
vlen = (vchildren !== undefined) ? vchildren.length : 0;
```

В целом, использование `&&` или `||` в небулевом контексте (особенно с числами) не слишком хорошее решение, из-за семантики `&&` и `||` в JavaScript.

Ещё один интересный пример неправильного использования `||`:

```javascript
function foo(a, b) {
a = a || "value";
b = b || 4;
//
}
```

В данном случае ошибочно отсекаются допустимые значения, такие как пустая строка `''` для `a` и `0` для `b`.

## Не доверяйте `undefined`
Выше мы использовали проверку

```javascript
if (obj !== undefined) {
//
}
```

Но всё ли с ней хорошо? Давайте проведём небольшой эксперимент

```javascript
const isDefined = (function() {
const undefined = 1;
return x => x !== undefined;
})();
console.log(isDefined(undefined)); // true
console.log(isDefined(1)); // false
```

На самом деле `undefined` не является ключевым словом в JavaScript. Это просто поле в глобальном объекте, и движок JS вынужден это учитывать. К счастью, в V8 уже присутствует неплохая оптимизация и если в цепочке видимости отсутствуют `eval` или `with`, компилятор не будет производить поиск значения `undefined` в глобальном объекте. Но вот в браузере Safari такая оптимизация отсутствует.

Защититься от подмены `undefined` (и немного упростить жизнь компилятору) можно путём вызова оператора `void`, который всегда возвращает настоящий `undefined`.

```javascript
if (obj !== void 0) {
//
}
```
Я не призываю использовать эту конструкцию, потому что она может поставить в тупик менее опытных коллег, столкнувшихся с вашим кодом. Но в случае необходимости достижения максимальной производительности стоит подумать о таком подходе. Также void 0 пригодится, если в вашем проекте включено [правило no-undefined в ESlint](http://eslint.org/docs/rules/no-undefined).

Подробнее читайте в статье «[Иногда undefined это defined](https://medium.com/devschacht/benedikt-meurer-sometimes-undefined-is-defined-91f32af4532c)»

---

*Слушайте наш подкаст в [iTunes](https://itunes.apple.com/ru/podcast/девшахта/id1226773343) и [SoundCloud](https://soundcloud.com/devschacht), читайте нас на [Medium](https://medium.com/devschacht), контрибьютьте на [GitHub](https://github.com/devSchacht), общайтесь в [группе Telegram](https://t.me/devSchacht), следите в [Twitter](https://twitter.com/DevSchacht) и [канале Telegram](https://t.me/devSchachtChannel), рекомендуйте в [VK](https://vk.com/devschacht) и [Facebook](https://www.facebook.com/devSchacht).*

[Статья на Medium](https://medium.com/devschacht/3-tips-about-javascript-597c33a219d6)
Loading

0 comments on commit d8dd989

Please sign in to comment.