npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

by-node-env

v2.0.1

Published

Run package.json scripts by NODE_ENV.

Downloads

1,032

Readme

by-node-env

Run package.json scripts by NODE_ENV.

Travis (.com) npm npm NPM

Installation

Install with npm:

npm install by-node-env

Install with pnpm:

pnpm install by-node-env

Install with Yarn:

yarn add by-node-env

Features

  • [x] Read NODE_ENV from process.env.
  • [x] Read NODE_ENV from .env file.
  • [x] Defaults NODE_ENV to development.
  • [x] Customize process.env for each NODE_ENV.
  • [x] Clearer, concise scripts in package.json.
  • [x] No more Bash scripting in package.json.
  • [x] Works on Linux, macOS, and Windows.
  • [x] Compatible with npm, pnpm, and Yarn.
  • [x] Consistent workflow for any NODE_ENV:
    1. npm install or pnpm install or yarn install.
    2. npm start or pnpm start or yarn start.

Problem

When developing a Node.js application in development mode, we often use these different commands: npm run serve, npm run watch, npm run dev, etc. In addition, we also set NODE_ENV=development as an environment variable.

When deploying to production, we often use these different commands: npm start, npm build, npm run prod, etc. NODE_ENV=production is a must-have environment variable in this case.

The package.json might look like this for those situations mentioned above:

{
    "scripts": {
        "watch": "webpack -d --watch",
        "build": "webpack -p",

        "dev": "nodemon src",
        "prod": "node dist",

        "serve": "npm run watch & npm run dev",
        "start": "npm build && npm run prod"
    }
}

Working on multiple projects with different commands can be very confusing and forgetting, especially under heavy cognitive load. As a result, we spend a lot of time consulting the README or the scripts field in package.json.

Solution

package.json

{
    "scripts": {
        "build": "by-node-env",

        "build:development": "webpack -d --watch",
        "build:production": "webpack -p",

        "start": "by-node-env",

        "start:development": "npm build & nodemon src",
        "start:production": "npm build && node dist"
    }
}

npm build and npm start have long been the de facto commands to build and start a Node.js application, respectively.

Besides that, NODE_ENV should always be explicitly set as an environment variable for best practice. A lot of popular frameworks expect NODE_ENV to be set as well.

Why not combine both, so that when NODE_ENV=production, executing npm start will spawn npm run start:production. Similarly, when NODE_ENV=development, executing npm start will spawn npm run start:development.

Arbitrary NODE_ENV and scripts work too, refer to more examples below.

NODE_ENV

The priority order of resolving NODE_ENV is as follows:

  1. Environment variable.
  2. .env file in project root directory.
  3. development (default).

The .env file, if present, must be located in the root directory of your project, where package.json lie.

The resolved NODE_ENV is available as process.env.NODE_ENV in your application at runtime.

Examples

Example 1a

Example 1a: package.json

{
    "scripts": {
        "start": "by-node-env", // 1

        "start:development": "ts-node src", // 2a
        "start:production": "ts-node-dev src" // 2b
    }
}
  1. npm start: 1 :arrow_right: 2a
  2. NODE_ENV=development npm start: 1 :arrow_right: 2a
  3. NODE_ENV=production npm start: 1 :arrow_right: 2b

Example 1b

Example 1b: .env

NODE_ENV=production

Example 1b: package.json

{
    "scripts": {
        "start": "by-node-env", // 1

        "start:development": "ts-node src", // 2a
        "start:production": "ts-node-dev src" // 2b
    }
}
  1. npm start: 1 :arrow_right: 2b
  2. NODE_ENV=development npm start: 1 :arrow_right: 2a
  3. NODE_ENV=production npm start: 1 :arrow_right: 2b

Example 2

Example 2: package.json

{
    "scripts": {
        // If NODE_ENV is missing, defaults to "development".
        "build": "by-node-env",

        "build:development": "webpack -d --watch",
        "build:production": "webpack -p",
        "build:staging": "webpack -p",

        // Deployment will not work unless NODE_ENV=production is explicitly set.
        "deploy": "by-node-env",

        "predeploy:production": "docker build -t ${DOCKER_USER}/${DOCKER_PROJECT} .",
        "deploy:production": "docker push ${DOCKER_USER}/${DOCKER_PROJECT}",

        // "npm start" is _the_ command to start the server across all environments.
        "start": "by-node-env",

        "start:development": "npm run build:development",

        "prestart:production": "npm run build",
        "start:production": "start-cluster build/server/server.js",

        "prestart:staging": "npm run build",
        "start:staging": "start-cluster build/server/server.js",

        // Explicitly set NODE_ENV, which is helpful in CI.
        "test": "NODE_ENV=test by-node-env",

        "test:test": "mocha"
    }
}

Contributing

Encounter bugs or having new suggestions?

Issues, comments, and PRs are always welcomed!