Introduction
ES6 (ECMAScript 2015) introduced a standardized module system to JavaScript, revolutionizing how we organize and share code. In this article, we'll explore the ins and outs of ES6 imports, providing real-world examples and a demo project to illustrate their power and flexibility.
Table of Contents
- Basic Import Syntax
- Named Exports and Imports
- Default Exports and Imports
- Mixing Named and Default Exports
- Renaming Imports
- Importing All Exports as an Object
- Dynamic Imports
- Real-world Examples
- Demo Project: Task Manager
- Best Practices and Tips
- Conclusion
Basic Import Syntax
The basic syntax for importing in ES6 is:
import { something } from './module-file.js';
This imports a named export called something
from the file module-file.js
in the same directory.
Named Exports and Imports
Named exports allow you to export multiple values from a module:
// math.js
export const add = (a, b) => a + b;
export const subtract = (a, b) => a - b;
// main.js
import { add, subtract } from './math.js';
console.log(add(5, 3)); // Output: 8
console.log(subtract(10, 4)); // Output: 6
Default Exports and Imports
Default exports provide a main exported value for a module:
// greet.js
export default function greet(name) {
return `Hello, ${name}!`;
}
// main.js
import greet from './greet.js';
console.log(greet('Alice')); // Output: Hello, Alice!
Mixing Named and Default Exports
You can combine named and default exports in a single module:
// utils.js
export const VERSION = '1.0.0';
export function helper() { /* ... */ }
export default class MainUtil { /* ... */ }
// main.js
import MainUtil, { VERSION, helper } from './utils.js';
console.log(VERSION); // Output: 1.0.0
const util = new MainUtil();
helper();
Renaming Imports
You can rename imports to avoid naming conflicts:
// module.js
export const someFunction = () => { /* ... */ };
// main.js
import { someFunction as myFunction } from './module.js';
myFunction();
Importing All Exports as an Object
You can import all exports from a module as a single object:
// module.js
export const a = 1;
export const b = 2;
export function c() { /* ... */ }
// main.js
import * as myModule from './module.js';
console.log(myModule.a); // Output: 1
console.log(myModule.b); // Output: 2
myModule.c();
Dynamic Imports
Dynamic imports allow you to load modules on demand:
async function loadModule() {
const module = await import('./dynamicModule.js');
module.doSomething();
}
loadModule();
Real-world Examples
- React Components:
// Button.js
import React from 'react';
export default function Button({ text, onClick }) {
return <button onClick={onClick}>{text}</button>;
}
// App.js
import React from 'react';
import Button from './Button';
function App() {
return <Button text="Click me" onClick={() => alert('Clicked!')} />;
}
- Node.js Modules:
// database.js
import mongoose from 'mongoose';
export async function connect() {
await mongoose.connect('mongodb://localhost:27017/myapp');
}
// server.js
import express from 'express';
import { connect } from './database.js';
const app = express();
connect().then(() => {
app.listen(3000, () => console.log('Server running'));
});
Demo Project: Task Manager
Let's create a simple task manager to demonstrate ES6 imports in action:
// task.js
export class Task {
constructor(id, title, completed = false) {
this.id = id;
this.title = title;
this.completed = completed;
}
toggle() {
this.completed = !this.completed;
}
}
// taskManager.js
import { Task } from './task.js';
export class TaskManager {
constructor() {
this.tasks = [];
}
addTask(title) {
const id = this.tasks.length + 1;
const task = new Task(id, title);
this.tasks.push(task);
return task;
}
toggleTask(id) {
const task = this.tasks.find(t => t.id === id);
if (task) {
task.toggle();
}
}
getTasks() {
return this.tasks;
}
}
// app.js
import { TaskManager } from './taskManager.js';
const manager = new TaskManager();
manager.addTask('Learn ES6 imports');
manager.addTask('Build a demo project');
console.log(manager.getTasks());
manager.toggleTask(1);
console.log(manager.getTasks());
To run this demo, you'll need to use a JavaScript environment that supports ES6 modules, such as Node.js with the --experimental-modules
flag or a modern browser with a bundler like webpack or Rollup.
Best Practices and Tips
- Use named exports for multiple functions/values, and default exports for main functionality.
- Keep your modules focused and single-purpose.
- Use consistent naming conventions for your files and exports.
- Avoid circular dependencies between modules.
- Consider using a bundler like webpack or Rollup for browser-based projects.
- Use dynamic imports for code-splitting and performance optimization in large applications.
Conclusion
ES6 imports provide a powerful and flexible way to organize JavaScript code. By understanding the various import and export syntaxes, you can create more modular, maintainable, and efficient applications. The demo project and real-world examples provided here should give you a solid foundation for using ES6 imports in your own projects.
Remember to always consider the specific needs of your project when deciding how to structure your modules and imports. Happy coding!
Top comments (0)