Skip to content

Instantly share code, notes, and snippets.

import { Store, Unsubscribe } from 'redux';
const defaultEqual = <P>(prev: P, next: P) => prev === next;
const defaultImmediately = true;
interface IWatcherParams<S, V, P> {
store: Store<S>;
selector: (state: S, params?: P) => V;
onChange: (prev: V, next: V) => void;
props?: P;
const path = require('path');
const webpack = require('webpack');
const vendor = [
{ library: 'jquery', globals: ['jQuery', '$'] },
{ library: 'react', globals: ['React'] },
{ library: 'react-dom', globals: ['ReactDOM'] }
];
const createExposeLoader = (config) => {
// Обработка opaque response https://stackoverflow.com/questions/39109789/what-limitations-apply-to-opaque-responses
// По умолчанию, ответы без Content-Length резервируют очень много пространства в хранилище браузера
const OpaqueResponsePlugin = {
// Меняем mode и credentials у запроса
requestWillFetch: async ({request}) => {
if (request.mode === 'cors' && request.credentials === 'same-origin') {
return request;
}
/**
* Класс для сбора и отложенного выполнения команд.
*
* Кейс для использования - класс с динамическим импортом модуля,
* методы которого должны сработать после успешной загрузки этого модуля.
*/
export class CommandExecutor {
private ready = false;
private commands: Map<string, any[]> = new Map();
/**
* State
*
* Для начала определим интерфейс этого кусочка хранилища,
* и создадим объект с начальным состоянием.
*/
export interface FieldState {
value: string;
focus: boolean;
}
@SuperOleg39
SuperOleg39 / foo.php
Last active September 22, 2018 14:38
public function isBrowser()
{
$arguments = func_get_args();
return $this->browserDetector->isBrowser(...$arguments);
}
enum States {
Empty = 'empty',
Liked = 'liked',
Disliked = 'disliked'
}
enum Actions {
Like = 'LIKE_ACTION',
Dislike = 'DISLIKE_ACTION'
}
<body
data-rocket-page
data-rocket-info="{
'properties': {
'ui_type': 'content_page',
'ui_id': 'card',
'ui_title': 'Мстители: Война бесконечности',
'content_id': 123456
},
'details': [{
const logger = require('../services/logger');
const needModifyResponse = (req, res) => {
return res.get('content-type') === 'application/json' && !req.path.includes('ajax');
};
/**
* Промежуточный обработчик запросов для модификации ответа от сервера
*/
const resJsonToHtmlMiddleware = (req, res, next) => {
Цикл API + Store + UI:
1) Модели в API
API/EntityFoo {
id,
bars: [ API/EntityBar ],
bazs: [ API/EntityBaz ],
…otherProps
}