nuxt-module-structure
Version:
The Nuxt Module Structure package allows you to create a modular architecture for your Nuxt applications, organizing your code into layers. This helps in maintaining a clean structure, especially for large applications. [Nuxt Layers](https://nuxt.com/docs
265 lines (232 loc) β’ 6.74 kB
Markdown
# Nuxt Module architecture
The Nuxt Module Structure package allows you to create a modular architecture for your Nuxt applications, organizing your code into layers. This helps in maintaining a clean structure, especially for large applications.
[Nuxt Layers](https://nuxt.com/docs/getting-started/layers) Documentation
You can find the official documentation for Nuxt Layers here:
π Nuxt Layers
## Installation
To initialize the main modules, run:
```bash
npm init-modules ./ -i18n
```
Replace `./` with your desired path for the main modules. If you need to configure `i18n`, include it as shown.
## Usage
When you run the initialization command, you will be prompted for:
1. **Name of the main module:** The default name is `app`.
2. **Authentication module:** The default is to create an authentication module.
## Directory Structure
Upon execution, the following directory structure will be created:
```
modules/
βββ app/
β βββ pages/
β βββ layouts/
β βββ components/
β βββ store/
βββ auth/
βββ pages/
βββ layouts/
βββ components/
βββ store/
```
Each module will automatically have its path added to the `nuxtModuleConfig`:
```nuxt
nuxtModuleConfig: {
dir: {
pages: "./pages", // Custom pages directory
layouts: "./layouts", // Custom layouts directory
// plugins:"./plugins", // Custom plugins directory
// assets: "./assets", // Custom assets directory
// middleware: "./middleware", // Custom middleware directory
},
extends: ["<layer-path>"]
}
```
# Next step
## Adding Separate Modules
To add a separate module in the future, run:
```bash
npm run add-module ./modules/app about-us
```
- **./modules/app** : <path-odd-added-module>
- **about-us**: <module-name>
You can specify additional configurations such as:
- **i18n** (if you need internationalization)
- **store** (if you need a pinia store)
- **layout** (if you need a layout)
```bash
npm run add-module ./modules/app about-us -i18n -store -layout
```
## Outbut
```
modules/
βββ app/
β βββ pages/
β βββ layouts/
β βββ components/
β βββ store/
β βββ about-us/ # Add the about-us module here
β βββ pages/
β βββ layouts/
β βββ components/
β βββ i18n/
βββ store/
βββ auth/
βββ pages/
βββ layouts/
βββ components/
βββ store/
```
## β οΈ Warning: Proper Module Structure
When adding a child module inside a parent module, **always** create a `modules/` directory inside the parent module and place the child module inside it.
### Correct Structure:
```
modules/
βββ app/
β βββ pages/
β βββ layouts/
β βββ components/
β βββ store/
β βββ modules/ # Create this directory inside the parent module
β βββ profile/ # Add child modules inside βmodules/β
β β βββ pages/
β β βββ layouts/
β β βββ components/
β β βββ store/
βββ auth/
βββ pages/
βββ layouts/
βββ components/
βββ store/
```
### β Incorrect Structure:
```
modules/
βββ app/
β βββ pages/
β βββ layouts/
β βββ components/
β βββ store/
β βββ profile/ # β Do NOT add child modules directly here
βββ auth/
```
### Why is this important?
- Keeps the module hierarchy clean and organized.
- Prevents conflicts and confusion when adding new modules.
- Ensures consistency across the project
## Module Auto-Generation
Page Creation
When adding a module, a page is automatically created inside the pages directory:
```
βββ home/
β βββ pages/
β βββββ/home.vue
β
βββββββββββββββββββββ
```
### home.vue
```nuxt
<template>
<div class="">${filename} page</div>
</template>
<script lang="ts" setup>
definePageMeta({
// layout: "module-lay",
});
</script>
```
---------------------------------------------------------------------------
###homeStore.ts
```js
import { defineStore } from "pinia";
const useModuleNameStore = defineStore("useModuleNameStore", () => {});
export default useuseModuleNameStoreStore;
```
----------------------------------------------------------------------------------------
## Is Store
###Store Setup
```
βββ module-name/
β βββ store/
β βββββ/moduleNameStore.ts
β
βββββββββββββββββββββ
```
###moduleNameStore.ts
```js
import { defineStore } from "pinia";
const useModuleNameStore = defineStore("useModuleNameStore", () => {});
export default useuseModuleNameStoreStore;
```
----------------------------------------------------------------------------------------
Layout Setup
Each module includes a layout file:
```
βββ module-name/
β βββ Layouts/
β βββββ/module-name-lay.vue
β
βββββββββββββββββββββ
```
###module-name-layout.vue
```vue
<script setup lang="ts">
// import parent layout what you want and wrap solt inside it to make sited layout
// import ParentLayout from "../../layouts/*****.vue"
</script>
<template>
<!-- <pearnt-layout> -->
<slot />
<!-- <pearnt-layout> -->
</template>
```
----------------------------------------------------------------------------------------
### Is i18n
###If i18n is not initialized when creating modules, running add-module --i18n will automatically generate i18n.config.ts in the root project.
<root-path>
```
βββ root/
β βββ i18n/
β βββββ/global
β βββββ/en.ts
β βββββ/ar.ts
β βββββ/i18n.config.ts
β
βββββββββββββββββββββ
```
i18n.config.ts <root-path>
```js
export default {
}
import en from "./global/en"
import ar from "./global/ar"
export default defineI18nConfig(() => ({
legacy: false,
locale: "ar",
fallbackLocale: "",
messages: {
en: {
...en,
},
ar: {
...ar,
},
},
}));
```
Global Translation Files (en.ts / ar.ts)
```js
export default {
}
```
##Using i18n as a Composable in components
```js
import ar from "../i18n/ar";
import en from "../i18n/en";
import { useI18n } from "vue-i18n";
const { t } = useI18n({
messages: {
en: en,
ar: ar,
},
});
```