📖 Scenario: You are building a small Deno script that uses Node.js-style APIs through Deno's shims. This helps you run familiar Node.js code in Deno without changing much.
🎯 Goal: Create a Deno script that imports the Node.js path module shim, sets up a file path, and uses the path.basename function to get the file name.
📋 What You'll Learn
Import the Node.js path shim from Deno's standard library
Create a string variable filePath with the value "/home/user/docs/report.txt"
Create a variable fileName that uses path.basename on filePath
Log the fileName to the console
💡 Why This Matters
🌍 Real World
Many developers want to run Node.js code in Deno without rewriting everything. Using Deno's Node.js shims lets you reuse familiar APIs easily.
💼 Career
Understanding how to use Deno's Node.js shims is useful for developers working on cross-platform JavaScript projects or migrating Node.js codebases to Deno.
Progress0 / 4 steps
1
Import the Node.js path shim
Write an import statement to import path from "https://deno.land/std/node/path.ts".
Deno
Hint
Use import path from "https://deno.land/std/node/path.ts"; to get the Node.js path shim.
2
Create the file path variable
Create a string variable called filePath and set it to "/home/user/docs/report.txt".
Deno
Hint
Use const filePath = "/home/user/docs/report.txt"; to create the path string.
3
Get the file name using path.basename
Create a variable called fileName and set it to the result of path.basename(filePath).
Deno
Hint
Use const fileName = path.basename(filePath); to get the file name.
4
Log the file name to the console
Add a line to log the variable fileName to the console using console.log.
Deno
Hint
Use console.log(fileName); to show the file name in the console.
Practice
(1/5)
1. What is the main purpose of Deno shims for Node.js APIs?
easy
A. To convert Deno code into Node.js code automatically
B. To allow using Node.js modules and APIs in Deno environment
C. To replace Deno's runtime with Node.js runtime
D. To compile TypeScript code into JavaScript
Solution
Step 1: Understand what shims do
Deno shims provide compatibility layers that mimic Node.js APIs inside Deno.
Step 2: Identify the purpose of these shims
The main goal is to let developers use Node.js modules and APIs in Deno without rewriting code.
Final Answer:
To allow using Node.js modules and APIs in Deno environment -> Option B
Quick Check:
Deno shims = Node.js API compatibility [OK]
Hint: Shims let Deno run Node.js code easily [OK]
Common Mistakes:
Thinking shims convert code automatically
Confusing runtime replacement with API compatibility
Assuming shims compile TypeScript
2. Which is the correct way to import the Node.js 'path' module shim in Deno?
easy
A. import path from 'https://deno.land/std/node/path.ts';
B. import { path } from 'https://deno.land/std/node/path.ts';
C. import * as path from 'https://deno.land/std/node/path.ts';
D. import path from 'node:path';
Solution
Step 1: Check Deno shim import style
Deno shims for Node.js modules are imported as namespaces using * as syntax.
Step 2: Match the correct import statement
Only import * as path from 'https://deno.land/std/node/path.ts'; correctly imports the shim as a namespace.
Final Answer:
import * as path from 'https://deno.land/std/node/path.ts'; -> Option C
Quick Check:
Namespace import = import * as [OK]
Hint: Use 'import * as' for Node.js shims in Deno [OK]
Common Mistakes:
Using default import syntax which is invalid here
Trying named import when module exports namespace
Using 'node:path' which is Node.js native, not Deno shim
3. What will be the output of this Deno code using Node.js 'path' shim?
import * as path from 'https://deno.land/std/node/path.ts';
console.log(path.basename('/foo/bar/baz.txt'));
medium
A. 'baz.txt'
B. '/foo/bar/baz.txt'
C. 'baz'
D. SyntaxError
Solution
Step 1: Understand path.basename behavior
The basename function returns the last part of a path, including extension.
Step 2: Apply to given path string
For '/foo/bar/baz.txt', the basename is 'baz.txt'.
Hint: basename returns last filename with extension [OK]
Common Mistakes:
Expecting the full path as output
Confusing basename with dirname
Syntax errors from wrong import (not here)
4. Identify the error in this Deno code using Node.js 'fs' shim:
import { readFileSync } from 'https://deno.land/std/node/fs.ts';
const data = readFileSync('./file.txt', 'utf8');
console.log(data);
medium
A. readFileSync does not accept encoding as second argument in Deno shim
B. The import path is incorrect, should be 'https://deno.land/std/node/fs.ts'
C. readFileSync is asynchronous and cannot be used like this
D. No error, code works as expected
Solution
Step 1: Verify the import
Named import { readFileSync } from Deno's std/node/fs.ts is valid as functions are named exports.
Step 2: Check readFileSync arguments
The function accepts encoding as a string ('utf8') as second argument, matching Node.js API.
Final Answer:
No error, code works as expected -> Option D
Quick Check:
readFileSync(path, 'utf8') valid [OK]
Hint: Named imports and string encoding work in Deno fs shim [OK]
Common Mistakes:
Believing encoding must always be an options object
Confusing with Deno's native synchronous APIs
Overlooking that fs shim closely mimics Node.js
5. You want to use the Node.js 'events' module shim in Deno to create an event emitter. Which code snippet correctly creates an emitter and listens for a 'ping' event?
hard
A. import * as events from 'https://deno.land/std/node/events.ts';
const emitter = new events.EventEmitter();
emitter.addListener('ping', () => console.log('pong'));
emitter.emit('ping');
B. import events from 'https://deno.land/std/node/events.ts';
const emitter = new events.EventEmitter();
emitter.on('ping', () => console.log('pong'));
emitter.emit('ping');
C. import EventEmitter from 'https://deno.land/std/node/events.ts';
const emitter = new EventEmitter();
emitter.on('ping', () => console.log('pong'));
emitter.emit('ping');
D. import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.on('ping', () => console.log('pong'));
emitter.emit('ping');
Solution
Step 1: Check correct import style for 'events' shim
The 'events' module shim exports as a namespace, so import * as events is correct.
Step 2: Verify usage of EventEmitter and event methods
Creating emitter with new events.EventEmitter() and using addListener or on works; here addListener is used correctly.
Step 3: Confirm emit triggers listener
Calling emitter.emit('ping') triggers the listener printing 'pong'.
Final Answer:
import * as events from 'https://deno.land/std/node/events.ts';
const emitter = new events.EventEmitter();
emitter.addListener('ping', () => console.log('pong'));
emitter.emit('ping'); -> Option A