diff --git a/.eslintrc b/.eslintrc
index ec0d68b9b851aecd5fed5b8c2c7b6c87f52f46f9..15eefba00ead3e95099b0064fe507a5cdc2e93e8 100755
--- a/.eslintrc
+++ b/.eslintrc
@@ -4,6 +4,9 @@
     "browser": true,
     "jquery": true,
   },
+  "parserOptions": {
+    "sourceType": "module",
+  },
   "rules": {
     "no-await-in-loop": "warn",
     "no-compare-neg-zero": "warn",
diff --git a/js/distances.js b/js/distances.js
index 1b848a5a3f73bd1df5b01f11e9c91a198790f7b7..d42907a3a35f7b15275622e25a387cd565ee8171 100644
--- a/js/distances.js
+++ b/js/distances.js
@@ -1,7 +1,22 @@
-/* exported getDistances */
-/* globals BasicQueue */
+import {BasicQueue} from './queue.js';
 
-function getDistances(graph, source) {
-  const result = new Map();
-  return result; // stub
+export function getDistances(graph, source) {
+  // TODO: This code has been copied from searches.js, but still needs to be modified.
+  const backpointers = new Map();
+  const worklist = new BasicQueue();
+  worklist.insert([undefined, source]);
+  while (worklist.size > 0) {
+    const [from, to] = worklist.remove();
+    if (backpointers.has(to)) {
+      continue;
+    }
+    backpointers.set(to, from);
+    if (to === destination) {
+      break;
+    }
+    for (const neighbor of graph.getNeighbors(to)) {
+      worklist.insert([to, neighbor]);
+    }
+  }
+  return backpointers;
 }
diff --git a/js/graphs.js b/js/graphs.js
index 2a8b3c0febc124f567c81adefe6921d4ce731c84..892575f56bd1b34c03a3e6f78a2c9c88c9fe503b 100644
--- a/js/graphs.js
+++ b/js/graphs.js
@@ -1,6 +1,4 @@
-/* exported Graph */
-
-class Graph {
+export class Graph {
   constructor() {
     this.neighbors = new Map();
   }
diff --git a/js/queue.js b/js/queue.js
index 8b05cced74a2ef671d0e871915b968a5be0c8ecc..9f45117ef2c499c64e728e90e0aea577d12718ba 100644
--- a/js/queue.js
+++ b/js/queue.js
@@ -1,6 +1,4 @@
-/* exported BasicQueue */
-
-class BasicQueue {
+export class BasicQueue {
   constructor() {
     this.elements = [];
     this.head = 0;
diff --git a/js/searches.js b/js/searches.js
index ce19294580f7820fb3a2bf78c23233dc8129269e..5d632653b1a418748c3ff7fa57c60ca71f2644a0 100644
--- a/js/searches.js
+++ b/js/searches.js
@@ -1,7 +1,8 @@
-/* exported dfs bfs fullDFS */
-/* globals BasicStack BasicQueue */
+import './utility.js';
+import {BasicStack} from './stack.js';
+import {BasicQueue} from './queue.js';
 
-function dfs(graph, source, destination) {
+export function dfs(graph, source, destination) {
   const backpointers = new Map();
   const worklist = new BasicStack();
   worklist.insert([undefined, source]);
@@ -25,7 +26,7 @@ function dfs(graph, source, destination) {
   return path.reverse();
 }
 
-function bfs(graph, source, destination) {
+export function bfs(graph, source, destination) {
   const backpointers = new Map();
   const worklist = new BasicQueue();
   worklist.insert([undefined, source]);
@@ -49,7 +50,7 @@ function bfs(graph, source, destination) {
   return path.reverse();
 }
 
-function fullDFS(graph) {
+export function fullDFS(graph) {
   const backpointers = new Map();
   for (const source of graph.vertices) {
     if (!backpointers.has(source)) {
diff --git a/js/stack.js b/js/stack.js
index e5612f27318a331677fec2d8adddc764f20af2bb..f87a910e1b2e60ec9c4b9105bc0d3d3e52223135 100644
--- a/js/stack.js
+++ b/js/stack.js
@@ -1,6 +1,4 @@
-/* exported BasicStack */
-
-class BasicStack {
+export class BasicStack {
   constructor() {
     this.elements = [];
   }
diff --git a/js/topological_sort.js b/js/topological_sort.js
index a35147b30c2ea5ea150b027ddba1a4cb192a4417..3b8f1bf2417e3f7e1867277069723fc0aa2f1bd6 100644
--- a/js/topological_sort.js
+++ b/js/topological_sort.js
@@ -1,5 +1,5 @@
-/* exported topologicalSort */
-/* globals BasicStack */
+import './utility.js';
+import {BasicStack} from './stack.js';
 
 class Finish {
   constructor(vertex) {
@@ -7,7 +7,26 @@ class Finish {
   }
 }
 
-function topologicalSort(graph) {
+export function topologicalSort(graph) {
   const result = [];
-  return result; // stub
+  // TODO: This code has been copied from searches.js, but still needs to be modified.
+  const backpointers = new Map();
+  for (const source of graph.vertices) {
+    if (!backpointers.has(source)) {
+      const worklist = new BasicStack();
+      worklist.insert([undefined, source]);
+      while (worklist.size > 0) {
+        const workitem = worklist.remove();
+        const [from, to] = workitem;
+        if (backpointers.has(to)) {
+          continue;
+        }
+        backpointers.set(to, from);
+        for (const neighbor of graph.getNeighbors(to)) {
+          worklist.insert([to, neighbor]);
+        }
+      }
+    }
+  }
+  return result;
 }
diff --git a/unit_tests/test_distances.js b/unit_tests/test_distances.js
index bf4b05a065e9a626acee687aa6c213e6153448fd..71545ef92646b68340f32199d48ca745c624d2e0 100644
--- a/unit_tests/test_distances.js
+++ b/unit_tests/test_distances.js
@@ -1,5 +1,8 @@
-QUnit.module('distances.js');
-/* globals QUnit Graph getDistances */
+import {Graph} from '../js/graphs.js';
+import {getDistances} from '../js/distances.js';
+
+/* globals QUnit */
+QUnit.module('test_distances.js');
 /* eslint-disable no-magic-numbers */
 
 QUnit.test('measure distances in random undirected graph #0', (assert) => {
diff --git a/unit_tests/test_topological_sort.js b/unit_tests/test_topological_sort.js
index 2c35574cbcf95af155b550063d7d4d037b97b56b..d9788a1af8b62673e56cbd7c05db31fbe658a37e 100644
--- a/unit_tests/test_topological_sort.js
+++ b/unit_tests/test_topological_sort.js
@@ -1,5 +1,8 @@
-QUnit.module('topological_sort.js');
-/* globals QUnit Graph topologicalSort */
+import {Graph} from '../js/graphs.js';
+import {topologicalSort} from '../js/topological_sort.js';
+
+/* globals QUnit */
+QUnit.module('test_topological_sort.js');
 /* eslint-disable no-magic-numbers */
 
 QUnit.test('topologically sort random directed graph #0', (assert) => {
diff --git a/unit_tests/unit_tests.html b/unit_tests/unit_tests.html
index e69abb658414947e07dd66c999bc88f9017f2cae..c9d2d7479583ccad8224c3f4c1395ac2b82127da 100644
--- a/unit_tests/unit_tests.html
+++ b/unit_tests/unit_tests.html
@@ -13,16 +13,8 @@
   <script src="../libraries/qunit/qunit.js"></script>
   <script src="overrides.js"></script>
 
-  <script src="../js/utility.js"></script>
-  <script src="../js/stack.js"></script>
-  <script src="../js/queue.js"></script>
-  <script src="../js/graphs.js"></script>
-
-  <script src="../js/distances.js"></script>
-  <script src="test_distances.js"></script>
-
-  <script src="../js/topological_sort.js"></script>
-  <script src="test_topological_sort.js"></script>
+  <script type="module" src="test_distances.js"></script>
+  <script type="module" src="test_topological_sort.js"></script>
 </body>
 
 </html>