package.json
جزء من قسم أساسيات Node.js في رحلة Node.js على Coddy. الدرس 22 من 24.
يحتاج المشروع إلى مكان واحد يوضّح اسمه وإصداره وكيفية تشغيله.
هذا المكان هو package.json. يتيح "type": "module" لملفات .js استخدام import، وتحدّد scripts أسماء الأوامر التي تُشغَّل باستخدام npm run، وتسرد dependencies الحزم التي ينزّلها npm install express إلى node_modules. ويمكن لبرنامج استيراد الملف نفسه:
{
"name": "weather",
"version": "0.3.1",
"type": "module",
"scripts": { "start": "node weather.js" },
"dependencies": { "express": "^5.1.0" }
}import pkg from './package.json' with { type: 'json' };
console.log(pkg.version);تخبر with { type: 'json' } Node بأن الملف بيانات وليس شفرة برمجية. وبدونها، يرفض Node عملية الاستيراد.
التحدي
سهل- يطبع الأمر
versionالقيمةnotes 1.2.0: الاسمينnameوversionالمقروءين منpackage.json.
شغّل node notes.js version. ثم عيّن الإصدار إلى 1.3.0 في package.json وشغّله مرة أخرى.
جرّب بنفسك
// تبدأ أداة تدوين ملاحظاتك من هنا.
import { rmSync } from 'node:fs';
import path from 'node:path';
import { formatNote } from './format.js';
import stats from './legacy/stats.cjs';
import store from './store.js';
const [command, ...words] = process.argv.slice(2);
const text = words.join(' ');
store.on('added', (note, n) => {
console.log(`Saved note ${n}.`);
});
const noteNumber = (word) => {
const n = Number(word);
if (!Number.isInteger(n) || n < 1 || n > store.notes.length) {
console.error(`No note ${word}`);
process.exit(1);
}
return n;
};
if (command === 'add') {
await store.add(text);
} else if (command === 'list') {
const owner = process.env.NOTES_OWNER ?? 'you';
console.log(`Notes for ${owner}`);
if (store.notes.length === 0) {
console.log('No notes yet');
}
const lines = store.notes.map((note, i) => formatNote(i + 1, note));
if (store.settings.sort === 'newest') {
lines.reverse();
}
lines.forEach((line) => console.log(line));
} else if (command === 'where') {
const file = path.join(process.cwd(), 'notes.json');
console.log(file);
console.log(path.basename(file));
} else if (command === 'stats') {
console.log(`${store.notes.length} notes, ${stats.countWords(store.notes)} words`);
} else if (command === 'done') {
const removed = await store.remove(noteNumber(words[0]));
console.log(`Done: ${removed}`);
} else if (command === 'remind') {
const note = store.notes[noteNumber(words[0]) - 1];
let count = 3;
const timer = setInterval(() => {
if (count > 0) {
console.log(count);
count -= 1;
} else {
console.log(note);
clearInterval(timer);
}
}, 200);
} else if (command === 'import') {
let input = '';
for await (const chunk of process.stdin) {
input += chunk;
}
const lines = input
.split('\n')
.map((line) => line.trim())
.filter((line) => line !== '');
for (const line of lines) {
await store.add(line);
}
console.log(`Imported ${lines.length} notes.`);
} else if (command === 'clear') {
rmSync('notes.json', { force: true });
console.log('Deleted notes.json');
} else {
if (command) {
console.error(`Unknown command: ${command}`);
}
console.error('Usage: node notes.js <command> [words]');
process.exit(1);
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.