From 400f9ed41aee517b2a19b3286c56d6f70e9b5a10 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Sat, 19 May 2018 14:18:00 -0700 Subject: [PATCH] load main script and css by reading asset-manifest. --- ext-src/extension.ts | 16 ++--- src/index.tsx | 2 - src/registerServiceWorker.ts | 123 ----------------------------------- 3 files changed, 6 insertions(+), 135 deletions(-) delete mode 100644 src/registerServiceWorker.ts diff --git a/ext-src/extension.ts b/ext-src/extension.ts index e8e9a3a..42f3371 100644 --- a/ext-src/extension.ts +++ b/ext-src/extension.ts @@ -87,18 +87,14 @@ class ReactPanel { } private _getHtmlForWebview() { + const manifest = require(path.join(this._extensionPath, 'build', 'asset-manifest.json')); + const mainScript = manifest['main.js']; + const mainStyle = manifest['main.css']; - // Local path to main script run in the webview - const scriptPathOnDisk = vscode.Uri.file(path.join(this._extensionPath, 'build', 'static', 'js', 'main.6883c34d.js')); - - // And the uri we use to load this script in the webview + const scriptPathOnDisk = vscode.Uri.file(path.join(this._extensionPath, 'build', mainScript)); const scriptUri = scriptPathOnDisk.with({ scheme: 'vscode-resource' }); - - const stylePathOnDisk = vscode.Uri.file(path.join(this._extensionPath, 'build', 'static', 'css', 'main.29266132.css')); - - // And the uri we use to load this style in the webview + const stylePathOnDisk = vscode.Uri.file(path.join(this._extensionPath, 'build', mainStyle)); const styleUri = stylePathOnDisk.with({ scheme: 'vscode-resource' }); - const baseStyles = ``; // Use a nonce to whitelist which scripts can be run const nonce = getNonce(); @@ -110,7 +106,7 @@ class ReactPanel { React App - ${baseStyles} + diff --git a/src/index.tsx b/src/index.tsx index a7b1306..3018943 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -2,10 +2,8 @@ import * as React from 'react'; import * as ReactDOM from 'react-dom'; import App from './App'; import './index.css'; -import registerServiceWorker from './registerServiceWorker'; ReactDOM.render( , document.getElementById('root') as HTMLElement ); -registerServiceWorker(); diff --git a/src/registerServiceWorker.ts b/src/registerServiceWorker.ts deleted file mode 100644 index 28c89f7..0000000 --- a/src/registerServiceWorker.ts +++ /dev/null @@ -1,123 +0,0 @@ -// tslint:disable:no-console -// In production, we register a service worker to serve assets from local cache. - -// This lets the app load faster on subsequent visits in production, and gives -// it offline capabilities. However, it also means that developers (and users) -// will only see deployed updates on the 'N+1' visit to a page, since previously -// cached resources are updated in the background. - -// To learn more about the benefits of this model, read https://goo.gl/KwvDNy. -// This link also includes instructions on opting out of this behavior. - -const isLocalhost = Boolean( - window.location.hostname === 'localhost' || - // [::1] is the IPv6 localhost address. - window.location.hostname === '[::1]' || - // 127.0.0.1/8 is considered localhost for IPv4. - window.location.hostname.match( - /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ - ) -); - -export default function register() { - if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { - // The URL constructor is available in all browsers that support SW. - const publicUrl = new URL( - process.env.PUBLIC_URL!, - window.location.toString() - ); - if (publicUrl.origin !== window.location.origin) { - // Our service worker won't work if PUBLIC_URL is on a different origin - // from what our page is served on. This might happen if a CDN is used to - // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374 - return; - } - - window.addEventListener('load', () => { - const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; - - if (isLocalhost) { - // This is running on localhost. Lets check if a service worker still exists or not. - checkValidServiceWorker(swUrl); - - // Add some additional logging to localhost, pointing developers to the - // service worker/PWA documentation. - navigator.serviceWorker.ready.then(() => { - console.log( - 'This web app is being served cache-first by a service ' + - 'worker. To learn more, visit https://goo.gl/SC7cgQ' - ); - }); - } else { - // Is not local host. Just register service worker - registerValidSW(swUrl); - } - }); - } -} - -function registerValidSW(swUrl: string) { - navigator.serviceWorker - .register(swUrl) - .then(registration => { - registration.onupdatefound = () => { - const installingWorker = registration.installing; - if (installingWorker) { - installingWorker.onstatechange = () => { - if (installingWorker.state === 'installed') { - if (navigator.serviceWorker.controller) { - // At this point, the old content will have been purged and - // the fresh content will have been added to the cache. - // It's the perfect time to display a 'New content is - // available; please refresh.' message in your web app. - console.log('New content is available; please refresh.'); - } else { - // At this point, everything has been precached. - // It's the perfect time to display a - // 'Content is cached for offline use.' message. - console.log('Content is cached for offline use.'); - } - } - }; - } - }; - }) - .catch(error => { - console.error('Error during service worker registration:', error); - }); -} - -function checkValidServiceWorker(swUrl: string) { - // Check if the service worker can be found. If it can't reload the page. - fetch(swUrl) - .then(response => { - // Ensure service worker exists, and that we really are getting a JS file. - if ( - response.status === 404 || - response.headers.get('content-type')!.indexOf('javascript') === -1 - ) { - // No service worker found. Probably a different app. Reload the page. - navigator.serviceWorker.ready.then(registration => { - registration.unregister().then(() => { - window.location.reload(); - }); - }); - } else { - // Service worker found. Proceed as normal. - registerValidSW(swUrl); - } - }) - .catch(() => { - console.log( - 'No internet connection found. App is running in offline mode.' - ); - }); -} - -export function unregister() { - if ('serviceWorker' in navigator) { - navigator.serviceWorker.ready.then(registration => { - registration.unregister(); - }); - } -}