A hookable, standards-based dynamic ES module loader for running native ES modules in older browsers.
SystemJS is a dynamic ES module loader that allows code written for native ES modules to run in older browsers. It solves the problem of using modern JavaScript module features (like dynamic imports and top-level await) in environments that don't support them natively, by transpiling modules to the System.register format. This enables developers to maintain a single codebase for both modern and legacy browser support.
Frontend developers and teams building applications that need to support older browsers (like IE11) while using modern ES module workflows, and those using bundlers like Rollup for code-splitting.
Developers choose SystemJS because it provides near-native performance, full ES module feature support, and extensive backward compatibility without requiring major changes to their development workflow. Its hookable architecture and import maps support make it highly flexible for complex applications.
Dynamic ES module loader
Open-Awesome is built by the community, for the community. Submit a project, suggest an awesome list, or help improve the catalog on GitHub.
Enables modern ES module features like top-level await and dynamic imports in browsers as old as IE11, with minimal performance overhead (only ~1.5x slower than native).
Provides built-in support for import maps via script tags, allowing bare specifier mapping to URLs, which simplifies dependency management without build tools.
Optimized for production with benchmarks showing near-native speeds; the s.js loader is only 2.8KB, minimizing bundle bloat.
Hookable architecture allows custom extensions, such as adding AMD support or dynamic import maps through pluggable extras, catering to complex workflows.
Requires manual inclusion of Promise and fetch polyfills for IE11, adding setup complexity and potential for missing dependencies in older environments.
The SystemJS Node.js loader explicitly does not support CommonJS modules, forcing reliance on native ESM or alternative loaders for server-side code.
External import maps in IE11 can trigger CORS issues due to missing Origin headers, necessitating attributes like crossorigin='anonymous' as a fix.