Wondering what’s next for npm?Check out our public roadmap! »


    1.1.0 • Public • Published


    Last version Build Status Coverage Status Dependency status Dev Dependencies Status NPM Status

    miconfig — Configuration loader for Node.js, browsers & Deno.


    • Easy: Designed for situations where a PhD into load configurations is infeasible.
    • Lightweight: no bloat, less than 1KB with all dependencies.
    • Isomorphic: Compatible with Node.js, browsers & Deno.
    • Flexible: Super easy load any kind of configuration.
    • Simple: The whole module is ~50 lines of code.


    $ npm install miconfig --save


    Load Configuration Files

    In miconfig, a configuration has a NODE_ENV value associated.

    You can load them for anywhere, e.g., from a folder called config:

    ├── index.js
    └── config
       ├── default.js
       ├── production.js
       ├── staging.js
       └── test.js

    Just call miconfig passing these configuration:

    const loadConfig = require('miconfig')
    const FILES = [
      NODE_ENV === 'development' ? undefined : NODE_ENV
    const environment = FILES.reduce(
      (acc, key) => ({
        [key]: require(`./config/${key}`)
    const config = loadConfig(environment)

    In case you want to use a different file format (like YAML), you've to parser them before be loaded:

    const loadConfig = require('miconfig')
    const yaml = require('js-yaml')
    const fs = require('fs')
    const fromYaml = filepath => yaml.safeLoad(fs.readFileSync(filepath, 'utf8'))
    const FILES = [
      NODE_ENV === 'development' ? undefined : NODE_ENV
    const environment = FILES.reduce(
      (acc, key) => ({
        [key]: fromYaml(`./config/${key}.yml`)
    const config = loadConfig(environment)

    The configuration default will always be loaded, being possible overwrite these defaults values by the current NODE_ENV configuration.

    In case you want to use a different source of truth rather than NODE_ENV, you can pass it as second argument:

    const loadConfig = require('miconfig')
    const config = loadConfig({
      default: require('./config/default'),
      production: require('./config/default')
    }, process.env.APP_ENV)

    Accessing to configuration

    After miconfig loads your configuration, you can safely access to any value

    Safe access

    // read a value, don't care if it's empty
    const database = config.get('database')

    Safe access + default value

    // read a value, use a default if empty
    const database = config.get('database', 'localhost')

    Require access

    // read a value, throw an error if it doesn't exist
    const database = config.require('database')

    Typecheck access

    // check if a value exists
    if (config.has('feature.prerender')) {
      console.log('prerender is enabled')

    Additionally, you can retrieve more than one value at one time with destructuring assignment:

    Destructuring safe access

    // read multiple values, don't care if it's empty
    const { timezone, database } = config

    Destructuring require access

    // read multiple values, throw an error if it doesn't exist
    const { timezone, database } = config.required


    miconfig © Kiko Beats, released under the MIT License. Logo by Absurd Design.

    Authored and maintained by Kiko Beats with help from contributors.

    kikobeats.com · GitHub Kiko Beats · Twitter @Kikobeats


    npm i miconfig

    DownloadsWeekly Downloads






    Unpacked Size

    11.1 kB

    Total Files


    Last publish


    • avatar