41554 blogs · [ { "id": "01a0879a-d429-7376-a8a4-8a52c5859777", "title": "Compile Svelte 5 in your head", "url": "https://lihautan.com/compile-svelte-5-in-your-head/", "published_at": "2025-07-20T08:00:00+00:00" }, { "id": "01a0879a-d429-7376-a8a4-8a52c5f4c3fc", "title": "Extract parameter types from string literal types with TypeScript", "url": "https://lihautan.com/extract-parameters-type-from-string-literal-types-with-typescript/", "published_at": "2022-03-27T08:00:00+00:00" }, { "id": "01a0879a-d429-7376-a8a4-8a52c6264fec", "title": "Demystifying Transitions", "url": "https://lihautan.com/demystifying-transitions/", "published_at": "2020-10-19T00:00:00+00:00" }, { "id": "01a0879a-d429-7376-a8a4-8a52c6ec41d3", "title": "Compile Svelte in your head", "url": "https://lihautan.com/compile-svelte-in-your-head/", "published_at": "2020-10-05T08:00:00+00:00" }, { "id": "01a0879a-d429-7376-a8a4-8a52c71bbaf3", "title": "Building a simplified webpack clone", "url": "https://lihautan.com/building-a-simplified-webpack-clone/", "published_at": "2020-10-02T08:00:00+00:00" }, { "id": "01a0879a-d429-7376-a8a4-8a52c7894acd", "title": "Contributing to Svelte - Implement {#key}", "url": "https://lihautan.com/contributing-to-svelte-implement-key-block/", "published_at": "2020-09-27T08:00:00+00:00" }, { "id": "01a0879a-d429-7376-a8a4-8a52c85d6ff3", "title": "Compile Svelte in your head (Part 4)", "url": "https://lihautan.com/compile-svelte-in-your-head-part-4/", "published_at": "2020-09-22T08:00:00+00:00" }, { "id": "01a0879a-d429-7376-a8a4-8a52c8ff6f04", "title": "Looking into the Svelte Compiler", "url": "https://lihautan.com/looking-into-the-svelte-compiler/", "published_at": "2020-09-14T00:00:00+00:00" }, { "id": "01a0879a-d429-7376-a8a4-8a52c97cb391", "title": "Third party CSS is not safe", "url": "https://lihautan.com/third-party-css-is-not-safe/", "published_at": "2020-09-02T00:00:00+00:00" }, { "id": "01a0879a-d429-7376-a8a4-8a52ca5e299c", "title": "Reduce minified code size by property mangling", "url": "https://lihautan.com/reduce-minified-code-size-by-property-mangling/", "published_at": "2020-08-08T08:00:00+00:00" }, { "id": "01a0879a-d429-7376-a8a4-8a52caceb0ed", "title": "Contributing to Svelte - Fixing issue #5012", "url": "https://lihautan.com/contributing-to-svelte-fixing-issue-5012/", "published_at": "2020-06-25T08:00:00+00:00" }, { "id": "01a0879a-d429-7376-a8a4-8a52cb57f3af", "title": "Retry asynchronous function using the callback pattern, promise chain and async await", "url": "https://lihautan.com/retry-async-function-with-callback-promise/", "published_at": "2020-06-21T08:00:00+00:00" }, { "id": "01a0879a-d429-7376-a8a4-8a52cbc4c36d", "title": "Contributing to Svelte - Fixing issue #4392", "url": "https://lihautan.com/contributing-to-svelte-fixing-issue-4392/", "published_at": "2020-05-23T08:00:00+00:00" }, { "id": "01a0879a-d429-7376-a8a4-8a52cbf4e9e6", "title": "Compile Svelte in your head (Part 3)", "url": "https://lihautan.com/compile-svelte-in-your-head-part-3/", "published_at": "2020-05-07T08:00:00+00:00" }, { "id": "01a0879a-d429-7376-a8a4-8a52cc7f10f1", "title": "The Svelte Compiler Handbook", "url": "https://lihautan.com/the-svelte-compiler-handbook/", "published_at": "2020-04-05T08:00:00+00:00" }, { "id": "01a0879a-d429-7376-a8a4-8a52cd754fa5", "title": "Compile Svelte in your head (Part 2)", "url": "https://lihautan.com/compile-svelte-in-your-head-part-2/", "published_at": "2020-03-22T08:00:00+00:00" }, { "id": "01a0879a-d429-7376-a8a4-8a52cdb74ead", "title": "Compile Svelte in your head (Part 1)", "url": "https://lihautan.com/compile-svelte-in-your-head-part-1/", "published_at": "2020-03-04T08:00:00+00:00" }, { "id": "01a0879a-d429-7376-a8a4-8a52ce70eec7", "title": "Hydrating text content from Server-Side Rendering", "url": "https://lihautan.com/hydrating-text-content/", "published_at": "2020-02-28T08:00:00+00:00" }, { "id": "01a0879a-d429-7376-a8a4-8a52ce9a3715", "title": "Webpack Additional Compilation Pass", "url": "https://lihautan.com/webpack-additional-compilation-pass/", "published_at": "2020-02-20T08:00:00+00:00" }, { "id": "01a0879a-d429-7376-a8a4-8a52cf0702e6", "title": "Personalised Development Workspace With Chrome Extension", "url": "https://lihautan.com/personalised-development-workspace-with-chrome-extension/", "published_at": "2020-02-08T00:00:00+00:00" }, { "id": "01a0879a-d429-7376-a8a4-8a52cf626361", "title": "Webpack's TemplatePlugin", "url": "https://lihautan.com/webpack-plugin-main-template/", "published_at": "2020-01-21T08:00:00+00:00" }, { "id": "01a0879a-d429-7376-a8a4-8a52cfa72dfa", "title": "Debugging Story: Build failed, error from Terser", "url": "https://lihautan.com/debugging-build-failed-error-from-terser/", "published_at": "2020-01-08T08:00:00+00:00" }, { "id": "01a0879a-d429-7376-a8a4-8a52d07fe580", "title": "Reactivity in Web Frameworks (Part 1)", "url": "https://lihautan.com/reactivity-in-web-frameworks-the-when/", "published_at": "2020-01-05T08:00:00+00:00" }, { "id": "01a0879a-d429-7376-a8a4-8a52d0be4141", "title": "Super Silly Hackathon 2019", "url": "https://lihautan.com/super-silly-hackathon-2019/", "published_at": "2019-12-14T08:00:00+00:00" }, { "id": "01a0879a-d429-7376-a8a4-8a52d188e624", "title": "JSON Parser with JavaScript", "url": "https://lihautan.com/json-parser-with-javascript/", "published_at": "2019-12-12T08:00:00+00:00" }, { "id": "01a0879a-d429-7376-a8a4-8a52d25abb42", "title": "Pause and resume a JavaScript function", "url": "https://lihautan.com/pause-and-resume-a-javascript-function/", "published_at": "2019-12-09T08:00:00+00:00" }, { "id": "01a0879a-d429-7376-a8a4-8a52d2a6202b", "title": "Short Stories working on Svelte", "url": "https://lihautan.com/short-stories-working-on-svelte/", "published_at": "2019-12-06T00:00:00+00:00" }, { "id": "01a0879a-d429-7376-a8a4-8a52d2dccc6b", "title": "I wrote a 12-line Rollup plugin", "url": "https://lihautan.com/12-line-rollup-plugin/", "published_at": "2019-11-30T08:00:00+00:00" }, { "id": "01a0879a-d429-7376-a8a4-8a52d3c4e486", "title": "Manipulating AST with JavaScript", "url": "https://lihautan.com/manipulating-ast-with-javascript/", "published_at": "2019-11-22T08:00:00+00:00" }, { "id": "01a0879a-d429-7376-a8a4-8a52d3fe75b0", "title": "I wrote my module bundler II", "url": "https://lihautan.com/i-wrote-my-module-bundler-ii-for-the-web/", "published_at": "2019-10-16T08:00:00+00:00" }, { "id": "01a0879a-d429-7376-a8a4-8a52d4c31051", "title": "Creating custom JavaScript syntax with Babel", "url": "https://lihautan.com/creating-custom-javascript-syntax-with-babel/", "published_at": "2019-09-25T08:00:00+00:00" }, { "id": "01a0879a-d42a-7146-adef-137dbe220f9e", "title": "I wrote my module bundler", "url": "https://lihautan.com/i-wrote-my-module-bundler/", "published_at": "2019-09-18T08:00:00+00:00" }, { "id": "01a0879a-d42a-7146-adef-137dbed6d87a", "title": "Solving Nonogram with Code", "url": "https://lihautan.com/solving-nonogram-with-code/", "published_at": "2019-09-14T08:00:00+00:00" }, { "id": "01a0879a-d42a-7146-adef-137dbf279878", "title": "Step-by-step guide for writing a custom babel transformation", "url": "https://lihautan.com/step-by-step-guide-for-writing-a-babel-transformation/", "published_at": "2019-09-12T08:00:00+00:00" }, { "id": "01a0879a-d42a-7146-adef-137dbfb76715", "title": "Git commits went missing after a rebase", "url": "https://lihautan.com/commit-went-missing-after-rebase/", "published_at": "2019-09-04T08:00:00+00:00" }, { "id": "01a0879a-d42a-7146-adef-137dc0049825", "title": "What is module bundler and how does it work?", "url": "https://lihautan.com/what-is-module-bundler-and-how-does-it-work/", "published_at": "2019-08-30T08:00:00+00:00" }, { "id": "01a0879a-d42a-7146-adef-137dc08f60ca", "title": "Git Gudder", "url": "https://lihautan.com/git-gudder/", "published_at": "2019-08-30T00:00:00+00:00" }, { "id": "01a0879a-d42a-7146-adef-137dc0f30548", "title": "Learn in Public", "url": "https://lihautan.com/learn-in-public/", "published_at": "2019-06-21T08:00:00+00:00" }, { "id": "01a0879a-d42a-7146-adef-137dc1da23eb", "title": "How to get started in contributing to open source", "url": "https://lihautan.com/how-to-get-started-in-contributing-to-open-source/", "published_at": "2019-06-05T08:00:00+00:00" }, { "id": "01a0879a-d42a-7146-adef-137dc2ac1caa", "title": "Debugging Web Workers", "url": "https://lihautan.com/Debugging web workers/", "published_at": "2019-05-22T08:00:00+00:00" }, { "id": "01a0879a-d42a-7146-adef-137dc34a4386", "title": "Parsing error when calling generic function with type arguments", "url": "https://lihautan.com/parsing-error-flow-type-parameter-instantiation/", "published_at": "2019-04-23T08:00:00+00:00" }, { "id": "01a0879a-d42a-7146-adef-137dc3ed6279", "title": "Errors encountered upgrading Flow v0.85", "url": "https://lihautan.com/errors-encountered-upgrading-flow-0.85/", "published_at": "2019-04-22T08:00:00+00:00" }, { "id": "01a0879a-d42a-7146-adef-137dc4c98dd1", "title": "History of Web Development: JavaScript Modules", "url": "https://lihautan.com/javascript-modules/", "published_at": "2019-04-12T00:00:00+00:00" }, { "id": "01a0879a-d42a-7146-adef-137dc55030f7", "title": "CSS Code Splitting", "url": "https://lihautan.com/css-code-splitting/", "published_at": "2019-03-27T00:00:00+00:00" }, { "id": "01a0879a-d42a-7146-adef-137dc5b55bab", "title": "Who accessed my property?", "url": "https://lihautan.com/who-accessed-my-property/", "published_at": "2019-03-24T08:00:00+00:00" }, { "id": "01a0879a-d42a-7146-adef-137dc5df959c", "title": "Understand the frontend tools", "url": "https://lihautan.com/understand-the-frontend-tools/", "published_at": "2019-03-16T08:00:00+00:00" }, { "id": "01a0879a-d42a-7146-adef-137dc5e8e900", "title": "Codemod with babel", "url": "https://lihautan.com/codemod-with-babel/", "published_at": "2019-03-13T08:00:00+00:00" }, { "id": "01a0879a-d42a-7146-adef-137dc6b07e39", "title": "My eslint doesn’t work with for flow 0.85’s explicit type argument syntax", "url": "https://lihautan.com/eslint-for-flow-explicit-type-argument-syntax/", "published_at": "2019-01-17T08:00:00+00:00" }, { "id": "01a0879a-d42a-7146-adef-137dc6c6cc0f", "title": "The `ascii_only` option in uglify-js", "url": "https://lihautan.com/uglify-ascii-only/", "published_at": "2018-10-27T08:00:00+00:00" }, { "id": "01a0879a-d42a-7146-adef-137dc78915cc", "title": "Dead-code elimination", "url": "https://lihautan.com/dead-code-elimination/", "published_at": "2018-10-24T08:00:00+00:00" }, { "id": "01a0879a-d42a-7146-adef-137dc7fe569d", "title": "Took me hours to realise why docker build ignores my .dockerignore", "url": "https://lihautan.com/why-docker-ignores-my-file/", "published_at": "2017-11-26T08:00:00+00:00" }, { "id": "01a0879a-d42a-7146-adef-137dc82332a4", "title": "Dynamically load reducers for code splitting in a React Redux application", "url": "https://lihautan.com/dynamically-load-async-reducer-for-code-splitting-in-react/", "published_at": "2017-11-16T08:00:00+00:00" }, { "id": "01a0879a-d42a-7146-adef-137dc87dbed6", "title": "Random stuff that I’ve learned from a browser’s developer console", "url": "https://lihautan.com/random-stuff-i-learned-from-browser-console/", "published_at": "2016-04-20T08:00:00+00:00" }, { "id": "01a0879a-d42a-7146-adef-137dc8a9740b", "title": "5 Steps to build NodeJS using Travis CI", "url": "https://lihautan.com/5-steps-to-build-nodejs-using-travis-ci/", "published_at": "2016-04-13T08:00:00+00:00" } ] posts Claim your blog
Back to lihautan.com
Blog · corpus.blog/blogs/lihautan.com/posts

lihautan.com

lihautan.com

2025

2022

2020

2019

2018

2017

2016