diff --git a/packages/react-dom/index.js b/packages/react-dom/index.js new file mode 100644 index 0000000..8681d19 --- /dev/null +++ b/packages/react-dom/index.js @@ -0,0 +1,5 @@ +import preact from 'preact' + +export default { + render: preact.render, +} diff --git a/packages/react/index.js b/packages/react/index.js new file mode 100644 index 0000000..003a8d1 --- /dev/null +++ b/packages/react/index.js @@ -0,0 +1,31 @@ +import preact from 'preact' +/** @jsx preact.h */ + +function shallowEqual(a, b) { + if (a === b) return true + if (typeof a === 'object' && typeof a === typeof b) { + if (a === null || b === null) return false + for (const key in a) { + if (a[key] !== b[key]) return false + } + for (const key in b) { + if (!Object.prototype.hasOwnProperty.call(a, key)) return false + } + return true + } + return false +} + +class PureComponent extends preact.Component { + shouldComponentUpdate(nextProps, nextState) { + return !shallowEqual(this.props, nextProps) || !shallowEqual(this.state, nextState) + } +} + +const React = { + ...preact, + PureComponent, + createElement: preact.h, +} + +export default React diff --git a/src/components/FileExplorer.js b/src/components/FileExplorer.js index dc1b32f..499547b 100644 --- a/src/components/FileExplorer.js +++ b/src/components/FileExplorer.js @@ -1,5 +1,4 @@ -import preact from 'preact' -/** @jsx preact.h */ +import React from 'react' import SearchBar from './SearchBar' import Node from './Node' @@ -9,18 +8,18 @@ import treeParser from '../utils/treeParser' import URLHelper from '../utils/URLHelper' import VisibleNodesGenerator from '../utils/VisibleNodesGenerator' -export default class List extends preact.Component { - state = { - // generated by this.visibleNodesGenerator - visibleNodes: null, - } - - props = { +export default class List extends React.Component { + static defaultProps = { treeData: null, metaData: null, freeze: false, } + state = { + // generated by this.visibleNodesGenerator + visibleNodes: null, + } + tasksAfterRender = [] visibleNodesGenerator = new VisibleNodesGenerator() diff --git a/src/components/Icon.js b/src/components/Icon.js index ca64f43..2673590 100644 --- a/src/components/Icon.js +++ b/src/components/Icon.js @@ -1,5 +1,4 @@ -import preact from 'preact' -/** @jsx preact.h */ +import React from 'react' import Grabber from '../assets/icons/octicons/grabber.svg?svgr' import Octoface from '../assets/icons/octicons/octoface.svg?svgr' @@ -71,7 +70,7 @@ function getSVGIconComponent(type) { export default function Icon({ type, className, ...otherProps }) { return (
- {preact.h(getSVGIconComponent(type), { width: '100%', height: '100%' })} + {React.createElement(getSVGIconComponent(type), { width: '100%', height: '100%' })}
) } diff --git a/src/components/MetaBar.js b/src/components/MetaBar.js index eee74dd..740c4d0 100644 --- a/src/components/MetaBar.js +++ b/src/components/MetaBar.js @@ -1,5 +1,4 @@ -import preact from 'preact' -/** @jsx preact.h */ +import React from 'react' export default function MetaBar({ metaData }) { const userUrl = metaData ? metaData.api && metaData.api.owner.html_url : undefined diff --git a/src/components/Node.js b/src/components/Node.js index 0db724b..0395d3f 100644 --- a/src/components/Node.js +++ b/src/components/Node.js @@ -1,5 +1,4 @@ -import preact from 'preact' -/** @jsx preact.h */ +import React from 'react' import PJAX from 'pjax' import Icon from './Icon' @@ -17,11 +16,7 @@ function getIconType(node) { } } -export default class Node extends preact.Component { - shouldComponentUpdate(nextProps) { - return !general.shallowEqual(this.props, nextProps) - } - +export default class Node extends React.PureComponent { onNodeClick = (...args) => { const { node, toggleExpand } = this.props if (node.type === 'tree') { @@ -36,14 +31,14 @@ export default class Node extends preact.Component { const { name, path } = node return (
-

{name} -

+
) } diff --git a/src/components/PJAXLink.js b/src/components/PJAXLink.js index 79eaa0b..6d4c723 100644 --- a/src/components/PJAXLink.js +++ b/src/components/PJAXLink.js @@ -1,9 +1,8 @@ -import preact from 'preact' -/** @jsx preact.h */ +import React from 'react' import DOMHelper from '../utils/DOMHelper' export default function PJAXLink({ to, children }) { - return preact.cloneElement(children, { + return React.cloneElement(children, { onClick: () => DOMHelper.loadWithPJAX(to), }) } diff --git a/src/components/Portal.js b/src/components/Portal.js new file mode 100644 index 0000000..2ac09ea --- /dev/null +++ b/src/components/Portal.js @@ -0,0 +1,3 @@ +import Portal from 'preact-portal' + +export default Portal diff --git a/src/components/ResizeHandler.js b/src/components/ResizeHandler.js index b95b5b0..4fac68d 100644 --- a/src/components/ResizeHandler.js +++ b/src/components/ResizeHandler.js @@ -1,9 +1,8 @@ -import preact from 'preact' -/** @jsx preact.h */ +import React from 'react' import Icon from './Icon' -export default class ResizeHandler extends preact.Component { +export default class ResizeHandler extends React.Component { pointerDown = false startX = 0 delta = 0 diff --git a/src/components/SearchBar.js b/src/components/SearchBar.js index bd50951..9b8508e 100644 --- a/src/components/SearchBar.js +++ b/src/components/SearchBar.js @@ -1,5 +1,4 @@ -import preact from 'preact' -/** @jsx preact.h */ +import React from 'react' export default function SearchBar({ onSearchKeyChange }) { return ( diff --git a/src/components/SettingsBar.js b/src/components/SettingsBar.js index 97b4737..2cae7b8 100644 --- a/src/components/SettingsBar.js +++ b/src/components/SettingsBar.js @@ -1,6 +1,4 @@ -import preact from 'preact' -/** @jsx preact.h */ - +import React from 'react' import Icon from './Icon' import storageHelper from '../utils/storageHelper' import keyHelper from '../utils/keyHelper' @@ -39,7 +37,7 @@ function friendlyFormatShortcut(shortcut) { } } -export default class SettingsBar extends preact.Component { +export default class SettingsBar extends React.Component { state = { accessTokenHint: null, accessToken: '', diff --git a/src/components/SideBar.js b/src/components/SideBar.js index e0ea8e0..ed561ef 100644 --- a/src/components/SideBar.js +++ b/src/components/SideBar.js @@ -1,13 +1,12 @@ -import preact from 'preact' -import Portal from 'preact-portal' +import React from 'react' import NProgress from 'nprogress' -/** @jsx preact.h */ import FileExplorer from './FileExplorer' import ToggleShowButton from './ToggleShowButton' import MetaBar from './MetaBar' import SettingsBar from './SettingsBar' import ResizeHandler from './ResizeHandler' +import Portal from './Portal' import cx from '../utils/cx' import DOMHelper, { REPO_TYPE_PRIVATE } from '../utils/DOMHelper' @@ -18,7 +17,7 @@ import keyHelper from '../utils/keyHelper' // initial width of side bar const baseSize = 260 -export default class SideBar extends preact.Component { +export default class SideBar extends React.Component { state = { // current width of side bar size: 260, @@ -58,8 +57,8 @@ export default class SideBar extends preact.Component { NProgress.start() } const treeData = await GitHubHelper.getTreeData({ ...metaData, accessToken }) - this.setState({ treeData }) this.logoContainerElement = DOMHelper.insertLogo() + this.setState({ treeData }) if (shouldShow) { NProgress.done() } diff --git a/src/components/ToggleShowButton.js b/src/components/ToggleShowButton.js index a38a445..8d46312 100644 --- a/src/components/ToggleShowButton.js +++ b/src/components/ToggleShowButton.js @@ -1,5 +1,4 @@ -import preact from 'preact' -/** @jsx preact.h */ +import React from 'react' import Icon from './Icon' import cx from '../utils/cx' diff --git a/src/content.js b/src/content.js index ad6f38b..8fecdf4 100644 --- a/src/content.js +++ b/src/content.js @@ -1,5 +1,5 @@ -import preact from 'preact' -/** @jsx preact.h */ +import React from 'react' +import ReactDOM from 'react-dom' import './content.less' @@ -7,4 +7,4 @@ import SideBar from './components/SideBar' const SideBarElement = document.createElement('div') document.body.appendChild(SideBarElement) -preact.render(, SideBarElement) +ReactDOM.render(, SideBarElement) diff --git a/src/utils/general.js b/src/utils/general.js index 27f4b95..b1c6ea4 100644 --- a/src/utils/general.js +++ b/src/utils/general.js @@ -1,18 +1 @@ -function shallowEqual(a, b) { - if (a === b) return true - if (typeof a === 'object' && typeof a === typeof b) { - if (a === null || b === null) return false - for (const key in a) { - if (a[key] !== b[key]) return false - } - for (const key in b) { - if (!Object.prototype.hasOwnProperty.call(a, key)) return false - } - return true - } - return false -} - -export default { - shallowEqual, -} +export default {} diff --git a/webpack.config.js b/webpack.config.js index fb31c6f..33d2ef8 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -4,6 +4,7 @@ const CopyWebpackPlugin = require('copy-webpack-plugin') const UglifyJSWebpackPlugin = require('uglifyjs-webpack-plugin') const srcPath = path.resolve(__dirname, 'src') +const packagesPath = path.resolve(__dirname, 'packages') const plugins = [ new CopyWebpackPlugin([ @@ -46,9 +47,6 @@ module.exports = { filename: '[name].js', }, resolve: { - alias: { - react: 'preact', // for svgr - }, modules: ['packages', 'node_modules'] }, module: { @@ -59,7 +57,7 @@ module.exports = { options: { cacheDirectory: true, }, - include: [srcPath], + include: [srcPath, packagesPath], }, { test: /\.less$/,