Skip to content
This repository was archived by the owner on Dec 5, 2024. It is now read-only.

Commit faf9cfc

Browse files
author
Federico Zivolo
committed
perf(Manager): Don't create an object on each render
+ several build improvements
1 parent 8c336fe commit faf9cfc

File tree

14 files changed

+241
-510
lines changed

14 files changed

+241
-510
lines changed

.eslintrc.js

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,14 @@
11
module.exports = {
22
root: true,
3-
extends: ['standard', 'standard-react', 'prettier', 'prettier/react'],
4-
plugins: ['prettier', 'jest'],
53
parser: 'babel-eslint',
64
env: {
75
browser: true,
8-
'jest/globals': true,
9-
},
10-
settings: {
11-
react: {
12-
version: '16.3',
13-
},
146
},
7+
plugins: ['react'],
158
rules: {
16-
// prettier
17-
'prettier/prettier': [
18-
'error',
19-
{ trailingComma: 'es5', singleQuote: true, semi: true },
20-
],
21-
'no-unexpected-multiline': 'off',
9+
'no-unused-vars': 'error',
10+
'react/jsx-uses-vars': 'error',
11+
'react/jsx-uses-react': 'error',
12+
'react/react-in-jsx-scope': 'error',
2213
},
2314
};

.prettierrc.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
module.exports = {
2+
singleQuote: true,
3+
trailingComma: 'es5',
4+
};

README.md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,9 @@
33
[![npm version](https://img.shields.io/npm/v/react-popper.svg)](https://www.npmjs.com/package/react-popper)
44
[![npm downloads](https://img.shields.io/npm/dm/react-popper.svg)](https://www.npmjs.com/package/react-popper)
55
[![Dependency Status](https://david-dm.org/souporserious/react-popper.svg)](https://david-dm.org/souporserious/react-popper)
6-
[![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com)
76
[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg)](https://github.com/prettier/prettier)
87

9-
React wrapper around [PopperJS](https://github.com/FezVrasta/popper.js/).
8+
React wrapper around [Popper.js](https://popper.js.org).
109

1110
## Install
1211

@@ -31,7 +30,7 @@ Via `script` tag (UMD library exposed as `ReactPopper`):
3130
Example:
3231

3332
```jsx
34-
import { Manager, Reference, Popper } from 'react-popper';
33+
import { Manager, Reference, Popper } from "react-popper";
3534

3635
const Example = () => (
3736
<Manager>
@@ -142,7 +141,7 @@ The `referenceElement` property must be an object with an interface compatible w
142141
If `referenceElement` is defined, it will take precedence over any `referenceProps.ref` provided refs.
143142
144143
```jsx
145-
import Popper from 'react-popper';
144+
import Popper from "react-popper";
146145

147146
class VirtualReference {
148147
getBoundingClientRect() {

flow-typed/npm/popper.js_v1.x.x.js

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,33 @@
1-
declare module 'popper.js' {
2-
declare type Position = 'top' | 'right' | 'bottom' | 'left';
1+
declare module "popper.js" {
2+
declare type Position = "top" | "right" | "bottom" | "left";
33
declare type Placement =
4-
| 'auto-start'
5-
| 'auto'
6-
| 'auto-end'
7-
| 'top-start'
8-
| 'top'
9-
| 'top-end'
10-
| 'right-start'
11-
| 'right'
12-
| 'right-end'
13-
| 'bottom-end'
14-
| 'bottom'
15-
| 'bottom-start'
16-
| 'left-end'
17-
| 'left'
18-
| 'left-start';
4+
| "auto-start"
5+
| "auto"
6+
| "auto-end"
7+
| "top-start"
8+
| "top"
9+
| "top-end"
10+
| "right-start"
11+
| "right"
12+
| "right-end"
13+
| "bottom-end"
14+
| "bottom"
15+
| "bottom-start"
16+
| "left-end"
17+
| "left"
18+
| "left-start";
1919

2020
declare type Offset = {
2121
top: number,
2222
left: number,
2323
width: number,
2424
height: number,
25+
position: Position,
2526
};
2627

27-
declare type Boundary = 'scrollParent' | 'viewport' | 'window';
28+
declare type Boundary = "scrollParent" | "viewport" | "window";
2829

29-
declare type Behavior = 'flip' | 'clockwise' | 'counterclockwise';
30+
declare type Behavior = "flip" | "clockwise" | "counterclockwise";
3031

3132
declare type Data = {
3233
instance: Popper,
@@ -36,6 +37,7 @@ declare module 'popper.js' {
3637
hide: boolean,
3738
arrowElement: Element,
3839
styles: CSSStyleDeclaration,
40+
arrowStyles: CSSStyleDeclaration,
3941
boundaries: Object,
4042
offsets: {
4143
popper: Offset,
@@ -83,8 +85,8 @@ declare module 'popper.js' {
8385
},
8486
computeStyle?: BaseModifier & {
8587
gpuAcceleration?: boolean,
86-
x?: 'bottom' | 'top',
87-
y?: 'left' | 'right',
88+
x?: "bottom" | "top",
89+
y?: "left" | "right",
8890
},
8991

9092
[name: string]: (BaseModifier & { [string]: * }) | null,

package.json

Lines changed: 20 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -3,42 +3,40 @@
33
"version": "1.0.0-beta.1",
44
"description": "React wrapper around Popper.js",
55
"license": "MIT",
6-
"author": "Travis Arnold <[email protected]> (http://souporserious.com)",
6+
"author":
7+
"Travis Arnold <[email protected]> (http://souporserious.com)",
78
"homepage": "https://github.com/souporserious/react-popper",
89
"main": "dist/react-popper.js",
910
"umd:main": "dist/react-popper.umd.js",
1011
"module": "lib/index.js",
1112
"typings": "typings/react-popper.d.ts",
12-
"files": [
13-
"dist",
14-
"lib",
15-
"typings/react-popper.d.ts"
16-
],
13+
"files": ["dist", "lib", "typings/react-popper.d.ts"],
1714
"scripts": {
18-
"build": "npm run build:clean && npm run build:es && npm run build:umd && npm run build:cjs && npm run build:flow && npm run build:umd-min && npm run build:cjs-min",
15+
"build":
16+
"npm run build:clean && npm run build:es && npm run build:umd && npm run build:cjs && npm run build:flow && npm run build:umd-min && npm run build:cjs-min",
1917
"build:clean": "rimraf dist/ && rimraf lib/",
2018
"build:es": "babel src --ignore '*.test.js,__mocks__' --out-dir lib",
21-
"build:umd": "rollup -c --output.format umd --output.name 'react-popper' --output.file dist/react-popper.umd.js",
22-
"build:cjs": "rollup -c --output.format cjs --output.name 'react-popper' --output.file dist/react-popper.js",
19+
"build:umd":
20+
"rollup -c --output.format umd --output.name 'react-popper' --output.file dist/react-popper.umd.js",
21+
"build:cjs":
22+
"rollup -c --output.format cjs --output.name 'react-popper' --output.file dist/react-popper.js",
2323
"build:flow": "flow-copy-source --ignore '{__mocks__/*,*.test}.js' src lib",
24-
"build:umd-min": "MINIFY=true rollup -c --output.format umd --output.name 'react-popper' --output.file dist/react-popper.umd.min.js",
25-
"build:cjs-min": "MINIFY=true rollup -c --output.format cjs --output.name 'react-popper' --output.file dist/react-popper.min.js",
24+
"build:umd-min":
25+
"MINIFY=true rollup -c --output.format umd --output.name 'react-popper' --output.file dist/react-popper.umd.min.js",
26+
"build:cjs-min":
27+
"MINIFY=true rollup -c --output.format cjs --output.name 'react-popper' --output.file dist/react-popper.min.js",
2628
"demo": "parcel --out-dir demo/dist demo/index.html",
2729
"pretest": "npm run lint",
2830
"test": "npm run test:flow && npm run test:ts && npm run test:jest",
2931
"test:ts": "tsc --project ./typings/tests",
3032
"test:flow": "flow check",
3133
"test:jest": "jest",
3234
"prepare": "npm run build",
33-
"precommit": "lint-staged",
34-
"format": "npm run lint -- --fix --quiet",
35-
"lint": "eslint --ext .js,.jsx src/ example/"
35+
"precommit": "pretty-quick --staged && eslint src"
3636
},
3737
"jest": {
3838
"setupTestFrameworkScriptFile": "<rootDir>jest.setup.js",
39-
"snapshotSerializers": [
40-
"enzyme-to-json/serializer"
41-
]
39+
"snapshotSerializers": ["enzyme-to-json/serializer"]
4240
},
4341
"repository": {
4442
"type": "git",
@@ -56,20 +54,14 @@
5654
"tooltip",
5755
"popover"
5856
],
59-
"lint-staged": {
60-
"@(src|demo)/**/*.{js,jsx}": [
61-
"eslint --fix --max-warnings 5",
62-
"git add"
63-
]
64-
},
6557
"peerDependencies": {
6658
"react": "0.14.x || ^15.0.0 || ^16.0.0",
6759
"react-dom": "0.14.x || ^15.0.0 || ^16.0.0"
6860
},
6961
"dependencies": {
7062
"create-react-context": "^0.2.1",
7163
"popper.js": "^1.14.1",
72-
"prop-types": "^15.6.1"
64+
"warning": "^3.0.0"
7365
},
7466
"devDependencies": {
7567
"@types/react": "^16.1.0",
@@ -83,38 +75,26 @@
8375
"babel-preset-env": "^1.6.1",
8476
"babel-preset-react": "^6.24.1",
8577
"babel-preset-stage-2": "^6.24.1",
86-
"chokidar": "^1.6.1",
87-
"create-styled-element": "^0.4.0",
8878
"enzyme": "^3.3.0",
8979
"enzyme-adapter-react-16": "^1.1.1",
9080
"enzyme-to-json": "^3.3.3",
9181
"eslint": "^4.19.1",
9282
"eslint-config-prettier": "^2.9.0",
93-
"eslint-config-standard": "^11.0.0",
94-
"eslint-config-standard-react": "^6.0.0",
95-
"eslint-plugin-import": "^2.10.0",
83+
"eslint-plugin-flowtype": "^2.46.1",
9684
"eslint-plugin-jest": "^21.15.0",
97-
"eslint-plugin-node": "^6.0.1",
98-
"eslint-plugin-prettier": "^2.6.0",
9985
"eslint-plugin-promise": "^3.7.0",
10086
"eslint-plugin-react": "^7.7.0",
101-
"eslint-plugin-standard": "^3.0.1",
10287
"flow-bin": "^0.69.0",
10388
"flow-copy-source": "^1.3.0",
104-
"glamor": "^2.20.24",
105-
"glamorous": "^3.11.1",
10689
"jest": "^22.4.3",
107-
"node-libs-browser": "^1.0.0",
10890
"outy": "^0.1.2",
10991
"parcel-bundler": "^1.6.2",
11092
"prettier": "^1.11.1",
111-
"react": "^16.3.0",
93+
"pretty-quick": "^1.4.1",
94+
"react": "16.2.0",
11295
"react-dom": "^16.3.0",
113-
"react-measure": "^1.4.6",
114-
"react-motion-ui-pack": "^0.10.2",
11596
"react-portal": "^4.1.4",
11697
"react-transition-group": "^2.2.1",
117-
"react-travel": "^1.3.0",
11898
"rimraf": "^2.6.2",
11999
"rollup": "^0.57.1",
120100
"rollup-plugin-babel": "^3.0.3",
@@ -123,7 +103,6 @@
123103
"rollup-plugin-node-globals": "^1.2.0",
124104
"rollup-plugin-node-resolve": "^3.3.0",
125105
"rollup-plugin-replace": "^2.0.0",
126-
"typescript": "^2.8.1",
127-
"velocity-react": "^1.2.2"
106+
"typescript": "^2.8.1"
128107
}
129108
}

src/Manager.js

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,41 @@
11
// @flow
2-
import React, { Component, type Node } from 'react';
3-
import createContext, { type Context } from 'create-react-context';
2+
import React, { Component, type Node } from "react";
3+
import createContext, { type Context } from "create-react-context";
44

55
export const ManagerContext: Context<{
66
getReferenceRef?: (?HTMLElement) => void,
77
referenceNode?: ?HTMLElement,
8-
}> = createContext({});
8+
}> = createContext({ getRefeferenceRef: undefined, referenceNode: undefined });
99

1010
type ManagerProps = {
1111
children: Node,
1212
};
1313
type ManagerState = {
14-
referenceNode?: ?HTMLElement,
14+
context: {
15+
getReferenceRef?: (?HTMLElement) => void,
16+
referenceNode?: ?HTMLElement,
17+
},
1518
};
1619

1720
export default class Manager extends Component<ManagerProps, ManagerState> {
18-
state = {};
21+
constructor() {
22+
super();
23+
this.state = {
24+
context: {
25+
getReferenceRef: this.getReferenceRef,
26+
referenceNode: undefined,
27+
},
28+
};
29+
}
1930

2031
getReferenceRef = (referenceNode: ?HTMLElement) =>
21-
this.setState({ referenceNode });
32+
this.setState(({ context }) => ({
33+
context: { ...context, referenceNode },
34+
}));
2235

2336
render() {
2437
return (
25-
<ManagerContext.Provider
26-
value={{
27-
referenceNode: this.state.referenceNode,
28-
getReferenceRef: this.getReferenceRef,
29-
}}
30-
>
38+
<ManagerContext.Provider value={this.state.context}>
3139
{this.props.children}
3240
</ManagerContext.Provider>
3341
);

0 commit comments

Comments
 (0)