{"id":15175406,"url":"https://github.com/datvt243/nodejs-api-boilerplate","last_synced_at":"2026-01-26T21:49:44.969Z","repository":{"id":254532682,"uuid":"846828095","full_name":"datvt243/nodejs-api-boilerplate","owner":"datvt243","description":"Ứng dụng nodejs (khung) xây dựng sẵn (basic)","archived":false,"fork":false,"pushed_at":"2024-10-29T12:32:11.000Z","size":36,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-09-06T18:46:57.711Z","etag":null,"topics":["express","nodejs","prettier-eslint","tailwindcss","typescript"],"latest_commit_sha":null,"homepage":"","language":"CSS","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/datvt243.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-08-24T04:21:49.000Z","updated_at":"2024-10-29T12:32:01.000Z","dependencies_parsed_at":"2024-08-24T05:34:52.271Z","dependency_job_id":"d7af942c-4172-4b3f-b1b4-77839879b8bd","html_url":"https://github.com/datvt243/nodejs-api-boilerplate","commit_stats":{"total_commits":4,"total_committers":1,"mean_commits":4.0,"dds":0.0,"last_synced_commit":"cadfb6d95f4a8b563a61909c10e3da617da64eb9"},"previous_names":["datvt243/nodejs-api-boilerplate"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/datvt243/nodejs-api-boilerplate","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datvt243%2Fnodejs-api-boilerplate","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datvt243%2Fnodejs-api-boilerplate/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datvt243%2Fnodejs-api-boilerplate/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datvt243%2Fnodejs-api-boilerplate/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/datvt243","download_url":"https://codeload.github.com/datvt243/nodejs-api-boilerplate/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datvt243%2Fnodejs-api-boilerplate/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28789080,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-26T21:13:08.818Z","status":"ssl_error","status_checked_at":"2026-01-26T21:13:08.448Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["express","nodejs","prettier-eslint","tailwindcss","typescript"],"created_at":"2024-09-27T12:23:47.972Z","updated_at":"2026-01-26T21:49:44.929Z","avatar_url":"https://github.com/datvt243.png","language":"CSS","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Source code Nodejs - Boilerplate\n\n- Express\n- Typescript\n- [Pugjs](https://pugjs.org/api/getting-started.html) (Template engine)\n- Tailwindcss\n- Prettier \u0026 Eslint\n\n## scripts\n\n```\nnpm start             :: chạy app env production\nnpm run build         :: build code src/*.ts -\u003e dist/*.js\nnpm run dev           :: chạy code env development\nnpm run prettier      :: check lỗi prettier\nnpm run prettier:fix  :: fix lỗi prettier\nnpm run lint          :: check lỗi eslint\nnpm run lint:fix      :: fix lỗi eslint\nnpm run tail:build    :: build file css\nnpm run pug:format    :: format file pug\n```\n\n- Trước khi chạy `npm start` cần chạy build (ra folder `dist`) trước.\n\n# Cấu trúc thư mục\n\n- dist: folder build\n- src: source\n  - assets: folder chứa các file css, js ...\n  - constants: chứa các files khai báo hằng số (const)\n  - database: file kết nối CSDL\n  - enviroments: file môi trường từ .env\n  - libs: folder chứa các file từ thư viện khác\n  - middlewares: các file xử lý middlewares\n  - public: chứa các file image, pdf ...\n  - routers: chứa các file khai náo router\n  - types: khai báo Typescript (type, interface ...)\n  - utils: khai báo các file chứa các hàm tiện ích\n  - views: chứa các file template (dùng Pugjs)\n- server.js:\n\n# Cài đặt Typescript - devDependencies\n\n- `typescript`\n- `@types/node`\n\n# Cài đặt ESLint\n\n`npm init @eslint/config@latest`\n\n## Cài đặt các package config cần thiết còn lại\n\n- `prettier`: Code formatter chính\n- `eslint-config-prettier`: Cấu hình ESLint để không bị xung đột với Prettier\n- `eslint-plugin-prettier`: Dùng thêm một số rule prettier cho eslint\n- `tsx`: Dùng để chạy TypeScript code trực tiếp mà không cần build\n- `tsc-alias`: Xử lý alias khi build\n- `rimraf`: Dùng để xóa folder dist khi trước khi build\n- `nodemon`: Dùng để tự động restart server khi có sự thay đổi trong code\n\n# Cấu hình\n\n## Cấu hình file tsconfig.json\n\nTạo file `tsconfig.json` tại thư mục root\nCopy nội dung bên dưới vào file `tsconfig`\n\n```\n{\n  \"compilerOptions\": {\n    \"module\": \"NodeNext\", // Quy định output module được sử dụng\n    \"moduleResolution\": \"NodeNext\",\n    \"target\": \"ES2023\", // Target output cho code\n    \"outDir\": \"dist\", // Đường dẫn output cho thư mục build\n    \"esModuleInterop\": true,\n    \"strict\": true /* Enable all strict type-checking options. */,\n    \"skipLibCheck\": true /* Skip type checking all .d.ts files. */,\n    \"baseUrl\": \".\", // Đường dẫn base cho các import\n    \"paths\": {\n      \"~/*\": [\"src/*\"] // Đường dẫn tương đối cho các import (alias)\n    }\n  },\n  \"files\": [\"src/type.d.ts\"], // Các file dùng để defined global type cho dự án\n  \"include\": [\"src/**/*\"] // Đường dẫn include cho các file cần build\n}\n```\n\n## Cấu hình file config cho Eslint\n\nMở file `eslint.config.mjs` lên và thêm nội dung dưới đây\nnhớ cài extension ESLint cho VS Code để nó hiểu được file này\n\n```\nimport eslintPluginPrettier from 'eslint-plugin-prettier'\n```\n\n```\n{\n    plugins: {\n      prettier: eslintPluginPrettier\n    },\n    rules: {\n      '@typescript-eslint/no-explicit-any': 'warn',\n      '@typescript-eslint/no-unused-vars': 'warn',\n      'prettier/prettier': [\n        'warn',\n        {\n          arrowParens: 'always',\n          semi: false,\n          trailingComma: 'none',\n          tabWidth: 2,\n          endOfLine: 'auto',\n          useTabs: false,\n          singleQuote: true,\n          printWidth: 120,\n          jsxSingleQuote: true\n        }\n      ]\n    },\n    ignores: ['**/node_modules/', '**/dist/']\n}\n```\n\n## Cấu hình file config cho Prettier\n\nTạo file `.prettierrc` trong thư trong thư mục root với nội dung dưới đây\n\n```\n{\n    \"arrowParens\": \"always\",\n    \"semi\": false,\n    \"trailingComma\": \"none\",\n    \"tabWidth\": 2,\n    \"endOfLine\": \"auto\",\n    \"useTabs\": false,\n    \"singleQuote\": true,\n    \"printWidth\": 120,\n    \"jsxSingleQuote\": true,\n    \"jsxBracketSameLine\": false,\n    \"bracketSameLine\": false,\n    \"bracketSpacing\": true,\n    \"embeddedLanguageFormatting\": \"auto\",\n    \"htmlWhitespaceSensitivity\": \"css\",\n    \"insertPragma\": false,\n    \"proseWrap\": \"preserve\",\n    \"quoteProps\": \"as-needed\",\n    \"requirePragma\": false,\n    \"vueIndentScriptAndStyle\": false,\n    \"singleAttributePerLine\": false,\n    \"plugins\": [\"@prettier/plugin-pug\"]\n}\n```\n\nTiếp theo Tạo file `.prettierignore` ở thư mục root, mục đích là bỏ qua các file không cần thiết\n\n```\nnode_modules/\ndist/\n```\n\n## Config editor để chuẩn hóa cấu hình editor\n\nTạo file `.editorconfig` ở thư mục root\nMục đích là cấu hình các config đồng bộ các editor với nhau nếu dự án có nhiều người tham gia.\n\n```\n[*]\nindent_size = 2\nindent_style = space\n```\n\n## Cấu hình file nodemon.json\n\nTạo file `nodemon.json` ở thư mục root\nMục đích là cấu hình nodemon để tự động restart server khi có sự thay đổi trong codeblockock\n\n```\n{\n  \"watch\": [\"src\", \".env\"],\n  \"ext\": \".ts,.js\",\n  \"ignore\": [],\n  \"exec\": \"tsx ./src/index.ts\"\n}\n```\n\n## Cấu hình file package.json\n\n```\n\"scripts\": {\n  \"dev\": \"NODE_ENV=development npx nodemon\",\n  \"build\": \"rimraf ./dist \u0026\u0026 tsc \u0026\u0026 tsc-alias \u0026\u0026 npm run copy\",\n  \"start\": \"NODE_ENV=production node ./dist/server.js\",\n  \"lint\": \"eslint .\",\n  \"lint:fix\": \"eslint . --fix\",\n  \"prettier\": \"prettier --check .\",\n  \"prettier:fix\": \"prettier --write .\",\n  \"tail:build\": \"npx tailwindcss -i ./src/assets/tailwindcss.css -o ./src/public/css/tailwindcss.css --watch\",\n  \"pug:format\": \"npx prettier --write \\\"src/views/**/*.pug\\\" --plugin=\\\"@prettier/plugin-pug\\\"\",\n  \"copy\": \"cp -R ./src/views ./src/assets ./src/public ./dist/\"\n}\n```\n\n# Tạo file type.d.ts\n\nTạo file `type.d.ts` trong thư mục `src`, tạm thời bây giờ để trống. Mục đích là để defined các global type cho dự án.\nMở file `tsconfig.json` lên sẽ thấy dòng được add file này vào để cho typescript nó nhận diện\n\n# Cài đặt template engine (Pugjs)\n\ntemplate engine sử dụng [Pugjs](https://pugjs.org/api/getting-started.html) (Template engine)\n\n```\npug pug-cli\n```\n\n- `\"@prettier/plugin-pug\"`: plugin dành cho Prettier, công cụ định dạng mã tự động, giúp bạn định dạng các file Pug (trước đây được gọi là Jade), một ngôn ngữ template dùng để tạo HTML.\n\nKhi build chỉ build các file `ts, js`. Folder `views`,`assets`, `public` không được build sang dist. Cần sao chép thủ công\n`cp -R ./src/views ./src/assets ./src/public ./dist/`\n\n# Cài đặt tailwindcss\n\nCài đặt tailwindcss và các package\n`npm install -D tailwindcss postcss autoprefixer`\n\nTạo file cầu hình `npx tailwindcss init -p`\n\n- `tailwind.config.js`\n\n```\n/** @type {import('tailwindcss').Config} */\nexport default {\n  darkMode: 'selector',\n  content: ['./src/**/*.{html,js,ts,tsx}', './src/views/**/*.pug'],\n  theme: {\n    extend: {}\n  },\n  plugins: []\n}\n```\n\nTạo file css `./src/assets/tailwindcss.css` với nội dung sau\n\n```\n@tailwind base;\n@tailwind components;\n@tailwind utilities;\n```\n\nChạy lệnh biên dịch\n`\"tail:build\": \"npx tailwindcss -i ./src/assets/tailwindcss.css -o ./src/public/css/tailwindcss.css --watch\",\n`\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdatvt243%2Fnodejs-api-boilerplate","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdatvt243%2Fnodejs-api-boilerplate","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdatvt243%2Fnodejs-api-boilerplate/lists"}