[RFC] perf: use an internal module resolver to improve require performance (#14633)

* perf: use an internal module resolver instead of relative requires

* perf: memoize the results of getting exported Electron properties

* perf: make internal module changes consistent across sandboxed / bundled files
This commit is contained in:
Samuel Attard 2018-09-20 13:43:26 +10:00 committed by GitHub
parent 73d1b76b54
commit 54ef906832
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
32 changed files with 156 additions and 73 deletions

View file

@ -1,5 +1,5 @@
if (process.platform === 'win32') {
module.exports = require('./auto-updater/auto-updater-win')
module.exports = require('@electron/internal/browser/api/auto-updater/auto-updater-win')
} else {
module.exports = require('./auto-updater/auto-updater-native')
module.exports = require('@electron/internal/browser/api/auto-updater/auto-updater-native')
}

View file

@ -2,7 +2,7 @@
const { app } = require('electron')
const { EventEmitter } = require('events')
const squirrelUpdate = require('./squirrel-update-win')
const squirrelUpdate = require('@electron/internal/browser/api/auto-updater/squirrel-update-win')
class AutoUpdater extends EventEmitter {
quitAndInstall () {

View file

@ -1,6 +1,6 @@
const common = require('../../../common/api/exports/electron')
const common = require('@electron/internal/common/api/exports/electron')
// since browser module list is also used in renderer, keep it separate.
const moduleList = require('../module-list')
const moduleList = require('@electron/internal/browser/api/module-list')
// Import common modules.
common.defineProperties(exports)
@ -8,6 +8,6 @@ common.defineProperties(exports)
for (const module of moduleList) {
Object.defineProperty(exports, module.name, {
enumerable: !module.private,
get: () => require(`../${module.file}`)
get: common.memoizedGetter(() => require(`@electron/internal/browser/api/${module.file}.js`))
})
}

View file

@ -1,6 +1,6 @@
'use strict'
const roles = require('./menu-item-roles')
const roles = require('@electron/internal/browser/api/menu-item-roles')
let nextCommandId = 0

View file

@ -1,7 +1,7 @@
'use strict'
const { TopLevelWindow, MenuItem, webContents } = require('electron')
const { sortMenuItems } = require('./menu-utils')
const { sortMenuItems } = require('@electron/internal/browser/api/menu-utils')
const EventEmitter = require('events').EventEmitter
const v8Util = process.atomBinding('v8_util')
const bindings = process.atomBinding('menu')

View file

@ -6,7 +6,7 @@ const path = require('path')
const url = require('url')
const { app, ipcMain, session, NavigationController, deprecate } = electron
const errorUtils = require('../../common/error-utils')
const errorUtils = require('@electron/internal/common/error-utils')
// session is not used here, the purpose is to make sure session is initalized
// before the webContents module.

View file

@ -1,7 +1,7 @@
'use strict'
const { ipcMain, webContents } = require('electron')
const parseFeaturesString = require('../common/parse-features-string')
const parseFeaturesString = require('@electron/internal/common/parse-features-string')
// Doesn't exist in early initialization.
let webViewManager = null

View file

@ -2,7 +2,7 @@
const { BrowserWindow, ipcMain, webContents } = require('electron')
const { isSameOrigin } = process.atomBinding('v8_util')
const parseFeaturesString = require('../common/parse-features-string')
const parseFeaturesString = require('@electron/internal/common/parse-features-string')
const hasProp = {}.hasOwnProperty
const frameToGuest = new Map()

View file

@ -15,7 +15,7 @@ process.argv.splice(1, 1)
require('../common/reset-search-paths')
// Import common settings.
require('../common/init')
require('@electron/internal/common/init')
var globalPaths = Module.globalPaths
@ -94,11 +94,11 @@ if (process.platform === 'win32') {
process.exit = app.exit
// Load the RPC server.
require('./rpc-server')
require('@electron/internal/browser/rpc-server')
// Load the guest view manager.
require('./guest-view-manager')
require('./guest-window-manager')
require('@electron/internal/browser/guest-view-manager')
require('@electron/internal/browser/guest-window-manager')
// Now we try to load app's package.json.
let packagePath = null
@ -151,16 +151,16 @@ app.setPath('userCache', path.join(app.getPath('cache'), app.getName()))
app.setAppPath(packagePath)
// Load the chrome extension support.
require('./chrome-extension')
require('@electron/internal/browser/chrome-extension')
const features = process.atomBinding('features')
if (features.isDesktopCapturerEnabled()) {
// Load internal desktop-capturer module.
require('./desktop-capturer')
require('@electron/internal/browser/desktop-capturer')
}
// Load protocol module to ensure it is populated on app ready
require('./api/protocol')
require('@electron/internal/browser/api/protocol')
// Set main startup script of the app.
const mainStartupScript = packageJson.main || 'index.js'

View file

@ -7,8 +7,8 @@ const v8Util = process.atomBinding('v8_util')
const { ipcMain, isPromise } = electron
const objectsRegistry = require('./objects-registry')
const bufferUtils = require('../common/buffer-utils')
const objectsRegistry = require('@electron/internal/browser/objects-registry')
const bufferUtils = require('@electron/internal/common/buffer-utils')
const hasProp = {}.hasOwnProperty
@ -367,13 +367,13 @@ handleRemoteCommand('ELECTRON_BROWSER_CONTEXT_RELEASE', (event, contextId) => {
})
handleRemoteCommand('ELECTRON_BROWSER_GUEST_WEB_CONTENTS', function (event, contextId, guestInstanceId) {
let guestViewManager = require('./guest-view-manager')
let guestViewManager = require('@electron/internal/browser/guest-view-manager')
return valueToMeta(event.sender, contextId, guestViewManager.getGuest(guestInstanceId))
})
ipcMain.on('ELECTRON_BROWSER_ASYNC_CALL_TO_GUEST_VIEW', function (event, contextId, requestId, guestInstanceId, method, ...args) {
try {
let guestViewManager = require('./guest-view-manager')
let guestViewManager = require('@electron/internal/browser/guest-view-manager')
let guest = guestViewManager.getGuest(guestInstanceId)
if (requestId) {
const responseCallback = function (result) {