From d370037618211c8642dd3c576edbc2d2b3d6e09e Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Thu, 19 Dec 2019 18:32:51 +0100 Subject: [PATCH] [api-minor] Tweak the Node.js fake worker loader to prevent `Critical dependency: ...` warnings from Webpack Since bundlers, such as Webpack, cannot be told to leave `require` statements alone we are thus forced to jump through hoops in order to prevent these warnings in third-party deployments of the PDF.js library; please see [Webpack issue 8826](https://github.com/webpack/webpack) and libraries such as [require-fool-webpack](https://github.com/sindresorhus/require-fool-webpack). *Please note:* This is based on the assumption that code running in Node.js won't ever be affected by e.g. Content Security Policies that prevent use of `eval`. If that ever occurs, we should revert to a normal `require` statement and simply document the Webpack warnings instead. --- src/display/api.js | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/display/api.js b/src/display/api.js index b66b7d857..262f16f3c 100644 --- a/src/display/api.js +++ b/src/display/api.js @@ -12,7 +12,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* globals __non_webpack_require__ */ /* eslint no-var: error */ /** @@ -1471,6 +1470,7 @@ const PDFWorker = (function PDFWorkerClosure() { let fakeWorkerCapability; if (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('GENERIC')) { + // eslint-disable-next-line no-undef if (isNodeJS && typeof __non_webpack_require__ === 'function') { // Workers aren't supported in Node.js, force-disabling them there. isWorkerDisabled = true; @@ -1534,8 +1534,22 @@ const PDFWorker = (function PDFWorkerClosure() { return worker.WorkerMessageHandler; } if ((typeof PDFJSDev !== 'undefined' && PDFJSDev.test('GENERIC')) && + // eslint-disable-next-line no-undef (isNodeJS && typeof __non_webpack_require__ === 'function')) { - const worker = __non_webpack_require__(getWorkerSrc()); + // Since bundlers, such as Webpack, cannot be told to leave `require` + // statements alone we are thus forced to jump through hoops in order + // to prevent `Critical dependency: ...` warnings in third-party + // deployments of the built `pdf.js`/`pdf.worker.js` files; see + // https://github.com/webpack/webpack/issues/8826 + // + // The following hack is based on the assumption that code running in + // Node.js won't ever be affected by e.g. Content Security Policies that + // prevent the use of `eval`. If that ever occurs, we should revert this + // to a normal `__non_webpack_require__` statement and simply document + // the Webpack warnings instead (telling users to ignore them). + // + // eslint-disable-next-line no-eval + const worker = eval('require')(getWorkerSrc()); return worker.WorkerMessageHandler; } await loadScript(getWorkerSrc());