31615
A resourceful newsletter featuring the latest and most important news, articles, books and updates in the world of #javascript 🚀 Don't miss our Quizzes! Let's chat: @nairihar
✌️ The JavaScript Bundler Grand Prix
Bundlers now sit at the heart of many JavaScript workflows and are sometimes even integrated into runtimes (e.g. Bun’s). This piece surveys the landscape and argues the speed wars are mostly over, with the real battle shifting to artifact size and the code that actually ships to users.
Kate Holterhoff
🌟 Anthropic just bought your favorite JS runtime...
🔥 Fireship
CHALLENGE
const x = 5;Читать полностью…
const y = 10;
const result = `${x + y}`;
const nested = `Value: ${`${x}` + `${y}`}`;
const expr = `${x}${y}`;
console.log(result);
console.log(nested);
console.log(expr);
console.log(typeof result);
💎 Sponsored
Gold quietly hit a new record in 2025 🚀
Some assets move fast, others move steadily, but both say something about how we react to risk.
How well do you read these shifts?
Check yourself by taking a short quiz.
CHALLENGE
const json = '{"name":"Sarah","age":25,"active":true}';
const obj = JSON.parse(json);
obj.name = "Emma";
obj.age++;
const json2 = JSON.stringify(obj);
const obj2 = JSON.parse(json2);
obj.age = 100;
console.log(obj2.age);
Читать полностью…
CHALLENGE
const x = null;Читать полностью…
const y = undefined;
const z = 0;
const result1 = x ?? 'default';
const result2 = y ?? 'default';
const result3 = z ?? 'default';
const combined = result1 ? result2 ? result3 : 'B' : 'C';
console.log(combined);
CHALLENGE
function Vehicle(type) {
this.type = type;
}
Vehicle.prototype.wheels = 4;
Vehicle.prototype.getInfo = function() {
return `${this.type}: ${this.wheels}`;
};
const car = new Vehicle('Car');
const bike = Object.create(car);
bike.type = 'Bike';
bike.wheels = 2;
console.log(car.getInfo() + ' | ' + bike.getInfo());
Читать полностью…
CHALLENGE
const obj = { a: 1, b: 2, c: 3 };
Object.defineProperty(obj, 'd', {
value: 4,
enumerable: false
});
const entries = Object.entries(obj);
const keys = Object.keys(obj);
const values = Object.values(obj);
console.log(entries.length + keys.length + values.length);
Читать полностью…
CHALLENGE
class Subject {
constructor() {
this.observers = [];
}
attach(observer) {
this.observers.push(observer);
}
notify(data) {
this.observers.forEach(obs => obs.update(data));
}
}
const subject = new Subject();
subject.attach({ update: (d) => console.log(d * 2) });
subject.attach({ update: (d) => console.log(d + 5) });
subject.notify(10);
Читать полностью…
CHALLENGE
const a = { x: 1 };
const b = a;
const c = { x: 1 };
b.x = 2;
const d = b;
d.x = 3;
console.log(a.x);
console.log(b.x);
console.log(c.x);
console.log(a === b);
console.log(a === c);
Читать полностью…
CHALLENGE
const x = 5;Читать полностью…
const y = 10;
const obj = {
x,
y,
z: x + y,
calculate() {
return this.x * this.y;
},
[x + y]: 'computed'
};
console.log(obj.calculate() + obj[15] + obj.z);
CHALLENGE
const map = new Map([Читать полностью…
['a', 1],
['b', 2],
['c', 3]
]);
const key = { id: 'key' };
map.set(key, 4);
map.set(key, 5);
const result = [];
result.push(map.get('a'));
result.push(map.get(key));
result.push(map.size);
result.push(map.has({ id: 'key' }));
console.log(result);
CHALLENGE
class EventEmitter {
constructor() {
this.events = {};
}
on(event, callback) {
this.events[event] = this.events[event] || [];
this.events[event].push(callback);
return this;
}
emit(event, data) {
if (this.events[event]) {
this.events[event].forEach(cb => cb(data));
}
return this;
}
}
const emitter = new EventEmitter();
emitter.on('test', x => console.log(x * 2))
.on('test', x => console.log(x + 5))
.emit('test', 10);
Читать полностью…
CHALLENGE
class Logger {
log(msg) {
return `[LOG]: ${msg}`;
}
}
class Formatter {
format(text) {
return text.toUpperCase();
}
}
class Service {
constructor(logger, formatter) {
this.logger = logger;
this.formatter = formatter;
}
process(data) {
const formatted = this.formatter.format(data);
return this.logger.log(formatted);
}
}
const service = new Service(new Logger(), new Formatter());
console.log(service.process('hello world'));
Читать полностью…
CHALLENGE
const getValue = (x) => {
console.log(`Getting: ${x}`);
return x;
};
const obj = { name: null };
const result = obj.name || getValue('default') && getValue('final');
console.log(`Result: ${result}`);
Читать полностью…
CHALLENGE
const numbers = [1, 2, 3, 4, 5];Читать полностью…
const result = numbers
.filter(n => n % 2 === 0)
.map(n => n * 2)
.reduce((acc, curr) => acc + curr, 0);
const original = numbers.slice();
numbers.splice(2, 1, 99);
console.log(result);
console.log(numbers);
console.log(original);
CHALLENGE
const obj = Object.seal({ a: 1, b: { c: 2 } });
obj.a = 10;
obj.b.c = 20;
obj.d = 30;
delete obj.a;
const frozen = Object.freeze({ x: 5, y: { z: 10 } });
frozen.x = 50;
frozen.y.z = 100;
delete frozen.y;
console.log(obj.a, obj.b.c, obj.d, frozen.x, frozen.y.z);
Читать полностью…
CHALLENGE
const x = 0.1 + 0.2;Читать полностью…
const y = 0.3;
console.log(x === y);
console.log(x.toFixed(1) === y.toFixed(1));
console.log(+x.toFixed(1) === +y.toFixed(1));
const num = 42;
console.log(num.toString(2));
console.log(parseInt('101010', 2));
CHALLENGE
const multiplier = 3;Читать полностью…
function createCounter() {
let count = 0;
const multiplier = 5;
return function() {
count++;
return count * multiplier;
};
}
const counter = createCounter();
console.log(counter());
console.log(counter());
console.log(multiplier);
CHALLENGE
function Vehicle(type) {
this.type = type;
this.wheels = 4;
}
Vehicle.prototype.describe = function() {
return `${this.type} with ${this.wheels} wheels`;
};
const car = new Vehicle('Car');
const bike = Vehicle('Bike');
console.log(car.describe());
console.log(typeof bike);
console.log(globalThis.type);
Читать полностью…
🤔 Open Sourcing the Remix Store
The Remix Store is a swag store for the Remix project and its codebase provides a powerful example of how Remix’s own core team builds apps with Remix and Hydrogen.
Brooks Lybrand and the Remix Team
👀 Useful Patterns for Building HTML Tools
In many situations, you don’t need a full-on framework to build useful tools; just HTML, JavaScript and CSS in a single file will do the job fine. Simon’s become a bit of an expert by rolling out many such tools using LLMs, and shares his process and practices here. More please!
Simon Willison
👀 Many Devs blame Vercel for Next.js-related React security vulnerabilities.
Because making new frameworks like Next.js is relatively easy nowadays, someone with enough social influence can literally destroy Vercel's business by popularising some other framework, which, by the way, would have nearly identical problems anyway, because this was mostly the React problem itself.
Tigran Bayburtsyan
⚠️ 🔵 Denial of Service and Source Code Exposure in React Server Components
Security researchers have found and disclosed two additional vulnerabilities in React Server Components while attempting to exploit the patches in last week’s critical vulnerability.
If you already updated for the Critical Security Vulnerability last week, you will need to update again.
If you updated to 19.0.2, 19.1.3, and 19.2.2, these are incomplete and you will need to update again.
December 11, 2025 by The React Team
CHALLENGE
const curry = (fn) => {
return function curried(...args) {
if (args.length >= fn.length) {
return fn.apply(this, args);
}
return (...nextArgs) => curried(...args, ...nextArgs);
};
};
const multiply = (a, b, c) => a * b * c;
const curriedMultiply = curry(multiply);
const step1 = curriedMultiply(2);
const step2 = step1(3);
const result = step2(4);
console.log(result);
Читать полностью…
CHALLENGE
const promise1 = Promise.resolve(10);Читать полностью…
const promise2 = promise1.then(x => x * 2);
const promise3 = promise2.then(x => {
console.log(x);
return x + 5;
});
const promise4 = promise2.then(x => {
console.log(x);
return x * 3;
});
Promise.all([promise3, promise4]).then(results => {
console.log(results);
});
🎉 JavaScript Turns 30 Years Old
Back in May 1995, a 33 year old Brendan Eich built the first prototype of JavaScript in just ten days, originally codenamed Mocha (and then LiveScript). On December 4, 1995, Netscape and Sun Microsystems officially announced 'JavaScript' in a press release as "an easy-to-use object scripting language designed for creating live online applications that link together objects and resources on both clients and servers."
Over thirty years, JavaScript has cemented its place at the heart of the Web platform, and more broadly in desktop apps, operating systems (e.g. Windows' use of React Native), mobile apps, and even on microcontrollers.
CHALLENGE
let obj1 = { name: 'Sarah' };
let obj2 = { name: 'Mike' };
obj1.ref = obj2;
obj2.ref = obj1;
let weakRef = new WeakRef(obj1);
let registry = new FinalizationRegistry((value) => {
console.log(`Cleanup: ${value}`);
});
registry.register(obj1, 'obj1-cleaned');
obj1 = null;
obj2 = null;
console.log(weakRef.deref()?.name || 'undefined');
console.log('Script completed');
Читать полностью…
CHALLENGE
const data = '{"users": [{"name": "Sarah", "age": 25}, {"name": "Mike", "age": null}]}';
try {
const parsed = JSON.parse(data);
const result = parsed.users.map(user => {
return user.age ?? 'unknown';
});
console.log(result.join(' - '));
} catch (error) {
console.log('Parse error occurred');
}
const invalidJson = '{"name": "John", age: 30}';
try {
JSON.parse(invalidJson);
console.log('Success');
} catch {
console.log('Invalid');
}
Читать полностью…