Creating an NPM library
Few notes on this and best-practices:
- Never commit dist / lib files to GitHub repo in addition to the src (source) code. Its just not needed and is a clunky way to manage the codebase. Github is used to manage and version source code, not store our files
- Your libraries should never include source code (src file) when you npm install it.
- You should use webpack or rollup t
Entry point
This gives the entry-point and tells npm to look at this file when the package is required or imported. You should have all your exports in this one file.
"main": "lib/index.js",
Scripts
- prepare script is the script that will be run when you npm install in another repo. This MUST include the build script.
- clean, used to delete the dist directories before building
- build:commonjs
- build:umd
- build:umd:min
- build
"scripts": {
"clean": "rimraf lib dist",
"test": "mocha test.js",
"build:commonjs": "babel src --out-dir lib",
"build:umd": "cross-env FILE_NAME=spongepoop webpack",
"build:umd:min": "cross-env NODE_ENV=production npm run build:umd",
"build": "npm run clean && npm run build:commonjs && npm run build:umd && npm run build:umd:min",
"prepare": "npm run build"
},
Files
When your package is installed in another project or app, files will list all of the files that should be included in the node_module directory of your package. Here, only dist should be included.
"files": [
"dist"
],
.gitignore
To prevent your source code repository on GitHub from including your build, add it to the .gitignore file.
# .gitignore
...
dist/
Transpile the code
Inside the package directory, install the following dependencies:
npm i -D @babel/core @babel/cli @babel/preset-env
@babel/core
Contains the core functionality of Babel.@babel/cli
Allows using Babel from the terminal.@babel/preset-env
A preset that includes all plugins to support modern JS.
You can configure Babel in many different ways, one of them is using a .babelrc file.
Create the .babelrc file in the root of the package and modify its content to match the following:
{
"presets": [
"@babel/preset-env"
]
}
Next, create a script to transpile the code to normal ES5 syntax using Babel CLI. Add a build script to package.json file:
{
...
"scripts": {
...
"build:commonjs": "babel src --out-dir lib",
...
},
...
}
Running this script npm run build:commonjs will create a lib directory with the transpiled code inside. Commonjs is the standard module specification that Node.js uses.
Publish to npm
Login to npm on your local to be able to publish to their servers.
npm login
Do a dry-run to see if everything is good and your tarball size (package size)
npm dryrun
Build if you need to:
npm run build
Then publish your public package
npm publish --access public
Do you want your library to run on front-end as well?
If so, you will need to create a Universal Module Definition (UMD) version.
Create a UMD version
This means bundling all your code and all of its dependencies into a single file. You can achieve this using Webpack.
Add the following development dependencies to your package:
npm i -D webpack webpack-cli cross-env
Cross-env is a package that allows setting environment variables properly across different platforms.
Create the configuration file webpack.config.js for Webpack in the root of the package. Contents of webpack.config.js should be:
const path = require('path');
const { NODE_ENV, FILE_NAME } = process.env;
const filename = `${FILE_NAME}${NODE_ENV === 'production' ? '.min' : ''}.js`;
module.exports = {
mode: NODE_ENV || 'development',
entry: [
'./src/index.js',
],
output: {
path: path.join(__dirname, 'dist'),
filename,
libraryTarget: 'umd',
},
};
Running commands npm run build:umd and npm run build:umd:min inside the package directory will create a new folder named dist that contains two files: lt-utils.js and lt-utils.min.js, respectively.
Resources:
- Import/Export
- A really through guide with best-practices: Guide
Publishing to Chaine
1. Create a NPM Account using your Chaine email
2. Send your username or NPM email to Param, Anurag or Annalise
3. Pull the repo package you want to publish
Pull the repo package you are working on. When you want to publish, you have to login with your npm login in that repo's directory.
4. Login on your local
When you want to publish, you have to login with your npm login in that repo's directory.
Once you are added to the organization, login on your local:
npm login
5. Follow the workflow for the repo
That's it. The repo's documentation should have instructions on remaining steps.
See an example here for Keychaine