diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3fab9bea4cc42ead945e3dd7e0e1e4902fdbe422..f318e9cc7b7364fc5550b0edcdcec6085f86d359 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,9 +6,12 @@ Note that since we don't clearly distinguish between a public and private interf
 
 ## [Unreleased]
 
-Fix impostor bond visuals not correctly updating on `sizeFactor` changes
-Fix degenerate case in PCA
-Fix near clipping avoidance in impostor shaders
+## [v3.31.3] - 2023-02-22
+
+- Fix impostor bond visuals not correctly updating on `sizeFactor` changes
+- Fix degenerate case in PCA
+- Fix near clipping avoidance in impostor shaders
+- Update `fs` import in `data-source.ts`
 
 ## [v3.31.2] - 2023-02-12
 
diff --git a/src/mol-util/data-source.ts b/src/mol-util/data-source.ts
index 5b9b65a68793cf04d49e800e36bc82a6fa5b308c..3d66dbf7466cc0ce305b10ce518949ca5377a34a 100644
--- a/src/mol-util/data-source.ts
+++ b/src/mol-util/data-source.ts
@@ -305,7 +305,8 @@ function ajaxGetInternal<T extends DataType>(title: string | undefined, url: str
 let _fs: (typeof import ('fs')) | undefined = undefined;
 function getFS() {
     if (_fs) return _fs!;
-    _fs = require('fs');
+    const req = require; // To fool webpack
+    _fs = req('fs');
     return _fs!;
 }