Introduction
As developers we might want to create a new framework or package reusables components, functions, etc...
Hopefully as JavaScript developers we have a NPM !
We may be also using TypeScript to add a layer of safety on top of Javascript plus a more advanced OOP design
So what about we create a NPM package which will be available to
JavaScript projects but most importantly Typescript projects ?
Let's go and let's see how we do it at Monisnap !
Getting Started
( I assume you have NodeJS and Typescript installed )
First create a new folder and open a terminal tab and type :
npm init -y
This will basically initialize your npm package by creating a package.json with some default options ( we will get back to that later )
and
tsc --init
This also initialize the project to use TypeScript by creating a tsconfig.json which holds important options defining how your TypeScript code will be handled.
So now you should have this :
Good ? next !
Now we can write some code :)
Create a "src" folder and two files inside it "index.ts" and "unicorn.ts" ( yes I like unicorns )
export class Unicorn { public sayHelloTo(name: string): string { return `🦄 Hello ${name} !`; } }
export * from "./unicorn";
We now need to edit the tsconfig.json ( copy / paste the following )
{ "compilerOptions": { "declaration": true, "strictNullChecks": true, "target": "es5", "outDir": "dist", "module": "commonjs", "moduleResolution": "node", "sourceMap": true, "lib": ["es2015", "dom"], "rootDir": "src" }, "include": ["src"], "exclude": ["node_modules", "dist"] }
let's cover the important options :
- declaration: It tells typescript to generate the typings ( important if we want some "automatic" docs for our code
- target: specify the ES target version ( I chose ES5 here because I target nodeJS )
- outDir: The compiled files destination
- module / module resolution: I use commonJS / nodeJS as its the module system on NodeJS
- sourceMap: Important if you want the source map to be able to debug Typescript code directly
- rootDir: The root folder where our code is.
Now we can edit the package.json :
{ "name": "unicorn-says-hello-world", "version": "1.0.0", "description": "A unicorn that says hello world", "main": "dist/index.js", "types": "dist/index.d.ts", "files": [ "dist" ], "scripts": { "build": "tsc", "prepare": "npm run build" }, "repository": { "type": "git", "url": "git+https://github.com/monisnap-jason/unicorn-says-hello-world.git" }, "keywords": [], "author": "monisnap-jason", "license": "ISC" }
Again the important options:
- name: the name of your package on NPM
- main: the entry point ( our code will be compiled in the dist folder )
- types: the path of our code typings
- files: The files we want to include in our package
- scripts:
- build: tsc to compile our code
- prepare: this is a NPM hook which executes a command before publishing to npm ( we tell it the execute the build command above )
- repository: the options about the repository which holds the package code
We also need a .gitignore file ( as we don't want to include some folders into our repository ):
\dist \node_modules
And lastly you can create README.md to tell the world how to use your package.
We're almost done !
Now the final touch :
npm publish
you should see this in your terminal output :
"+ your-package-name@1.0.0"
And voilà your package is on NPM
here is mine for reference unicorn-says-hello-world
Now if I want to use my brand new package I just to need npm install unicorn-says-hello-world in a new or existing project, and I can use it like that :
Drop a comment below if you have any questions !
Have a good one :)
Top comments (1)
Hi, I would like to ask, what's the UI library used by monisnap.com?
cause I saw similar style used by remoteok.io.
Interested to use the same style! Thanks!