js-library-distribution
Patterns for developing distributable JavaScript/TypeScript libraries. Use when building npm packages, SDK libraries, or any code that runs in customer environments.
Installation
Follow the repository instructions for this skill and your agent. Review the files and dependencies before adding it to your workflow.
View source ↗GuidesSkill instructions
Library Distribution Patterns
Critical: No Global Pollution
Distributable libraries run in customer environments alongside unknown code. Global pollution can break customer sites.
NEVER Modify Global Objects
// ❌ CRITICAL: Never extend native prototypes
Array.prototype.customMethod = function() { ... }
String.prototype.format = function() { ... }
Object.prototype.toJSON = function() { ... }
// ❌ CRITICAL: Never modify third-party libraries
import _ from 'lodash'
_.customUtil = function() { ... } // Pollutes lodash globally
// ❌ CRITICAL: Never assign to window/global
window.MyLib = { ... }
globalThis.MyLib = { ... }
Safe Patterns
// ✅ Export your own functions
export function customMethod(arr: unknown[]) { ... }
export function format(str: string) { ... }
// ✅ Use composition, not extension
import { map } from 'lodash'
export function customMap<T>(arr: T[]) {
return map(arr, /* your logic */)
}
// ✅ If global is unavoidable, use unique namespace
const UNIQUE_NAMESPACE = '__myCompany_myLib_v1__'
if (typeof window !== 'undefined') {
(window as any)[UNIQUE_NAMESPACE] = { ... }
}
No Side Effects on Import
// ❌ BAD: Side effects when imported
// This runs immediately when someone imports your library
console.log('Library loaded')
fetch('/api/init')
document.addEventListener('DOMContentLoaded', ...)
// ✅ GOOD: Explicit initialization
export function init(config: Config) {
// Side effects only when user explicitly calls
}
Bundle Considerations
Tree-Shaking Support
// ✅ Use named exports for tree-shaking
export { functionA } from './a'
export { functionB } from './b'
// ❌ Barrel exports can break tree-shaking
export * from './everything'
Dual Package (ESM + CJS)
{
"main": "./dist/index.cjs",
"module": "./dist/index.mjs",
"types": "./dist/index.d.ts",
"exports": {
".": {
"import": "./dist/index.mjs",
"require": "./dist/index.cjs",
"types": "./dist/index.d.ts"
}
}
}
Dependency Management
// ❌ BAD: Bundling dependencies (version conflicts)
// Your lodash 4.x vs customer's lodash 3.x
// ✅ GOOD: Peer dependencies
// package.json
{
"peerDependencies": {
"lodash": "^4.0.0"
}
}
Checklist Before Publish
- No
prototypemodifications - No third-party library modifications
- No implicit globals (
window.X,globalThis.X) - No side effects on import
- Named exports for tree-shaking
- Peer dependencies declared
- Tested in isolation AND alongside common libraries
Examples
Read the usage examples in the source repository.
View source ↗Source history
- Indexed on
- 2026-03-11
- Index updated
- 2026-03-11
- Branch
- main
Index and sync dates describe this directory. View the source repository for code history.
GitHub ↗chat Comments (0)
Sign in to join the discussion and leave a comment.
No comments yet. Be the first to share your thoughts!