-
Notifications
You must be signed in to change notification settings - Fork 1.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fix WASM JS script not working after minification (#4562)
* bug fix * bug fix batch 2 * bug fix 3 * fix * fix
- Loading branch information
1 parent
54c3f4d
commit 0dccac9
Showing
7 changed files
with
235 additions
and
87 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,114 @@ | ||
/** | ||
* @license | ||
* Copyright 2018 Google LLC. All Rights Reserved. | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
* ============================================================================= | ||
*/ | ||
|
||
import {terser} from 'rollup-plugin-terser'; | ||
|
||
/** | ||
* Returns a standardized list of browser package configuration options | ||
* that we want to use in all our rollup files and ship to NPM. | ||
* | ||
* @param {string} fileName | ||
* @param {string} preamble | ||
* @param {boolean} visualize - produce bundle visualizations for certain | ||
* bundles | ||
* @param {boolean} ci is this a CI build | ||
* @param {object} terserExtraOptions is any extra options passed to terser | ||
*/ | ||
export function getBrowserBundleConfigOptions( | ||
config, name, fileName, preamble, visualize, ci, terserExtraOptions = {}) { | ||
const bundles = []; | ||
|
||
const terserPlugin = | ||
terser({output: {preamble, comments: false}, ...terserExtraOptions}); | ||
const extend = true; | ||
const umdFormat = 'umd'; | ||
const fesmFormat = 'es'; | ||
|
||
// UMD ES5 minified | ||
bundles.push(config({ | ||
plugins: [terserPlugin], | ||
output: { | ||
format: umdFormat, | ||
name, | ||
extend, | ||
file: `dist/${fileName}.min.js`, | ||
freeze: false | ||
}, | ||
tsCompilerOptions: {target: 'es5'}, | ||
visualize | ||
})); | ||
|
||
if (ci) { | ||
// In CI we do not build all the possible bundles. | ||
return bundles; | ||
} | ||
|
||
// UMD ES5 unminified | ||
bundles.push(config({ | ||
output: { | ||
format: umdFormat, | ||
name, | ||
extend, | ||
file: `dist/${fileName}.js`, | ||
freeze: false | ||
}, | ||
tsCompilerOptions: {target: 'es5'} | ||
})); | ||
|
||
// UMD ES2017 | ||
bundles.push(config({ | ||
output: | ||
{format: umdFormat, name, extend, file: `dist/${fileName}.es2017.js`}, | ||
tsCompilerOptions: {target: 'es2017'} | ||
})); | ||
|
||
// UMD ES2017 minified | ||
bundles.push(config({ | ||
plugins: [terserPlugin], | ||
output: { | ||
format: umdFormat, | ||
name, | ||
extend, | ||
file: `dist/${fileName}.es2017.min.js` | ||
}, | ||
tsCompilerOptions: {target: 'es2017'}, | ||
visualize | ||
})); | ||
|
||
// FESM ES2017 | ||
bundles.push(config({ | ||
output: | ||
{format: fesmFormat, name, extend, file: `dist/${fileName}.fesm.js`}, | ||
tsCompilerOptions: {target: 'es2017'} | ||
})); | ||
|
||
// FESM ES2017 minified | ||
bundles.push(config({ | ||
plugins: [terserPlugin], | ||
output: { | ||
format: fesmFormat, | ||
name, | ||
extend, | ||
file: `dist/${fileName}.fesm.min.js` | ||
}, | ||
tsCompilerOptions: {target: 'es2017'}, | ||
visualize | ||
})); | ||
|
||
|
||
return bundles; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
/** | ||
* @license | ||
* Copyright 2021 Google LLC. All Rights Reserved. | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
* ============================================================================= | ||
*/ | ||
|
||
/** | ||
* This file patches the Emscripten-generated WASM JS script so that it can be | ||
* properly loaded in web worker. | ||
* | ||
* We need to pass the content of this script to WASM module's | ||
* mainScriptUrlOrBlob field so that the web worker can correctly load the | ||
* script "inline". The returned content of the script (after it self-executes) | ||
* is a anonymous function object in which we have the following if block: | ||
* | ||
* if (_scriptDir) { | ||
* scriptDirectory = _scriptDir; | ||
* } | ||
* | ||
* It works great if the script runs in the main page, where _scriptDir is | ||
* initialized to the path of the tf-backend-wasm.js file, outside of the | ||
* function object. However, when the script runs in a web worker, the | ||
* code that initializes _scriptDir won't be present since it is outside | ||
* of the scope of the function object. As a result, a "Uncaught | ||
* ReferenceError: _scriptDir is not defined" error will be thrown fron | ||
* the web worker. | ||
* | ||
* To fix this, we will replace all the occurences of "if(_scriptDir)" | ||
* with a better version that first checks whether _scriptDir is defined | ||
* or not | ||
* | ||
* For more context, see: | ||
* /~https://github.com/emscripten-core/emscripten/pull/12832 | ||
*/ | ||
const fs = require('fs'); | ||
|
||
const BASE_PATH = './wasm-out/'; | ||
const JS_PATH = `${BASE_PATH}tfjs-backend-wasm-threaded-simd.js`; | ||
|
||
let content = fs.readFileSync(JS_PATH, 'utf8'); | ||
content = content.replace( | ||
/if\s*\(\s*_scriptDir\s*\)/g, | ||
'if(typeof _scriptDir !== "undefined" && _scriptDir)'); | ||
fs.chmodSync(JS_PATH, 0o644); | ||
fs.writeFileSync(JS_PATH, content); |
Oops, something went wrong.