В настоящее время почти все веб-сервисы или интеграции выполняются поверх среды выполнения Node.js. Node.js — это гибкая платформа с широкой поддержкой сообщества. Можно даже создавать такие документы, как xlsx, docx или pdf, прямо из Node.js. Все основные облачные платформы используют Node.js в качестве языка первого уровня.

Модульность

Node.js по своей конструкции обеспечивает модульность за счет использования структуры node_modules. Все необходимые модули хранятся в каталоге node_modules, и мы можем вызывать модули в любом месте нашего кода.

Но используем ли мы эту модульность в коде нашего приложения. Большинство приложений, которые я вижу, содержат папку lib, в которой мы храним все файлы JS. Эти файлы js импортируются в необходимые области с использованием относительных путей.

const db = require("../db/")
const logging = require ("../../logging")

Основная проблема с таким подходом заключается в том, что когда мы меняем путь к служебному файлу, путь к БД должен измениться. Кроме того, формат не читается. Нас запутает подлинность файла.

Решение

Гораздо лучший подход — спроектировать наше приложение в виде модулей, таких как БД, ведение журнала, ошибка и т. д. Допустим, ваше приложение называется cms, тогда гораздо проще представить модуль с помощью области видимости.

require("@cms/db")

Вы можете разрабатывать модули отдельно и публиковать их на любом сервере NPM (общедоступном/частном) и использовать его как любой другой модуль.

Если вашему приложению нужен модуль ведения журнала:

npm install --save @cms/logging

Если вы не хотите разбивать свое приложение на части, есть еще один подход.

Лучший способ

Храните нужные модули в отдельной папке. Допустим, «@cms». Используйте отдельную папку для каждого модуля и пусть модули имеют отдельный package.json. Таким образом, он станет действительным модулем Node.

Package.json для модулей будет выглядеть так

{
"name": "@cms/db",
"version": "1.0.1",
"description": "db module for CMS Application",
"main": "index.js",
"dependencies":{
     "mysql" : "latest"
 }
}

Когда модули будут готовы, пришло время написать скрипт. Добавьте install.js в папку «scripts».

let fs = require('fs')
console.log('Creating symlinks ...')
if (fs.existsSync('node_modules/@cms')) {
    console.log('link exists already ')
} else {
    let source = '../@cms'
    console.log(`creating link for ${source}`)
    fs.symlinkSync(source, 'node_modules/@cms', 'junction')
    console.log('done')
}

Добавьте этот скрипт в ваш основной package.json.

{
 "name": "CMSApplication",
 "version": "1.0.1",
 "description": "Sample CMS Application",
 "main": "index.js",
 "scripts": {
  "install": "node scripts/install.js",
  "start": "node index.js"
 },
 "dependencies": {
  "express": "latest"
 }
}

Скрипт будет выполняться каждый раз, когда вы выполняете установку npm. Таким образом, как только все остальные модули узла будут определены и зависимости будут установлены, будет создана ссылка из папки @cms снаружи на папку @cms внутри node_modules. Таким образом, любые изменения, внесенные вами во внешнюю папку @cms, будут отражены в папке внутри node_modules.

Вы можете видеть, что символические ссылки установлены для @cms. Это не файл ярлыка, а жесткие ссылки, созданные с помощью «ln» в Linux.

Внутри @cms вы можете увидеть наши модули, которые определены во внешней папке @cms.

Таким образом, вы можете достичь модульности. Папка «@cms» является частью вашего исходного кода. Затем вы можете импортировать необходимые модули обычным способом.

const {logger} = require("@cms/logging")
logger.info("Welcome to CMS Application")

Если вы хотите, чтобы ваше приложение выполнялось, запустите «npm install», а затем «npm start».

Такой подход помогает мне сделать приложение более модульным и расширяемым. Дайте мне знать ваши мысли по этому поводу.