Skip to content

Modularisation ​

Configuring the project ​

In order to use ES6 imports, we need to modify our package.json. Add a new line like this:

json
{
  "name": "health-tracker",
  "version": "1.0.0",
  "type": "module", 
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "mocha",
    "hello": "echo \"Hello, world!\""
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "mocha": "^10.2.0"
  }
}

INFO

The other style of importing is called CommonJS and is older than the ES6 style. We're recommending ES6 as CommonJS will eventually be deprecated.

Named and default exports ​

We can use the export keyword to make const, function and class available in other files in our project.

We import named exports with {}, but we don't need {} to import default exports.

js
export const x = 7
export const y = 12

const msg = 'Hello from a.js!'
export default msg
js
import { x, y } from './a.js'
import msg from './a.js'

console.log(x + y)
console.log(msg)
console
19
Hello from a.js!

Structuring the project ​

Let's suppose we're organising our code into classes:

  • DiaryEntry to monitor our wellbeing
  • Meal to track our meals
  • Workout to log our exercise

We usually put these types of classes in to a folder called models.

bash
mkdir models
cd models
touch DiaryEntry.js Meal.js Workout.js
console
health-tracker/
├── models
│   ├── DiaryEntry.js
│   ├── Meal.js
│   └── Workout.js
├── .gitignore
├── node_modules/
├── package.json
└── package-lock.json

Exporting the classes ​

We'll just put a bit of starter code in each one to begin with:

js
class DiaryEntry {
  constructor(txt, mood) {
    this.txt = txt
    this.mood = mood
  }
}

export default DiaryEntry 
js
class Meal {
  constructor(name, calories) {
    this.name = name
    this.calories = calories
  }
}

export default Meal 
js
class Workout {
  constructor(activity, time) {
    this.activity = activity
    this.time = time
  }
}

export default Workout 

Note the use of export default at the bottom of each file. This allows us to export the class and use it in a different file.

Importing the classes ​

Let's create a file called app.js in the root of the health-tracker project. We will import our classes here and play around with them.

bash
touch app.js
console
health-tracker/
├── app.js
├── models
│   ├── DiaryEntry.js
│   ├── Meal.js
│   └── Workout.js
├── .gitignore
├── node_modules/
├── package.json
└── package-lock.json

In app.js, we'll import the three classes:

js
import DiaryEntry from './classes/DiaryEntry.js'
import Meal from './classes/Meal.js'
import Workout from './classes/Workout.js'

// Now we can use our classes in app.js!
const entry = new DiaryEntry('I am learning Node!', 8.9)
const meal = new Meal('Aubergine curry', 1250)
const workout = new Workout('Yoga', 30)

console.log(entry)
console.log(meal)
console.log(workout)
console
DiaryEntry { txt: 'I am learning Node!', mood: 8.9 }
Meal { name: 'Aubergine curry', calories: 1250 }
Workout { activity: 'Yoga', time: 30 }