كيف تعمل البرمجة المعيارية في Node.js

الوحدات النمطية هي إحدى السمات الأساسية لـ Node.js.

عندما تقوم ببناء تطبيق ، حيث تصبح الشفرة أكثر تعقيدًا ، لا يمكنك وضع التعليمات البرمجية بالكامل في ملف واحد.

نظرًا لأن هذا يصبح غير قابل للإدارة ، يمكنك استخدام نمط الوحدة النمطية لـ Node لكتابة ملفات مختلفة وتصديرها (بما في ذلك الوظائف والكائنات والأساليب) إلى الملف الرئيسي.

الآن قد تسأل - ما هو بالضبط module؟

بعبارات بسيطة ، فإن a moduleليس سوى ملف JavaScript. هذا هو.

باستخدام الوظائف المعيارية لـ Node ، يمكننا استيراد ملفاتنا الخارجية ووحدات العقدة الأساسية (الأصلية) ووحدات NPM. في هذه المقالة ، سنناقش كل واحد من هذه بالتفصيل.

كيفية استيراد ملفاتك الخاصة

في هذه المقالة ، سنناقش كيف يمكننا تصدير واستيراد ملفاتنا الخاصة.

في الأساس ، هناك ملفان: calculate.js، من حيث سنقوم بالتصدير ، وإلى main.jsحيث سنستورد هذا الملف.

mduleexport.png

لدينا كلا الملفين في نفس المجلد لإبقائه بسيطًا.

image.png

كيفية استيراد دالة

//---- Exported file [calculate.js] ---- const add = (a,b)=>{ return a + b } module.exports = add 

هنا نقوم بتصدير دالة تسمى addاستخدام module.exports. ثم يتم استيراد هذه الوظيفة إلى ملف مختلف باستخدام requireالطريقة.

في العقدة ، يُشار إلى كل ملف باسم a module، exportsوهو خاصية كائن الوحدة النمطية.

يمكننا الآن استدعاء الوظيفة في ملف مختلف ، أي main.jsبتمرير الوسائط كما هو موضح أدناه.

//------ Main File[main.js] ---- const add = require('./calculate') //name of the desired file const result = add(2,4) console.log(result); //Output : 6 

كيفية استيراد كائن

يمكننا أيضًا تصدير كائن كامل والوصول إلى الطرق المختلفة فيه.

//---- Exported file [calculate.js] ---- const add = { result : (a,b)=>{ return a + b } } module.exports = add 

قمنا بتصدير الكائن addواستيراده إلى ملفنا الرئيسي باستخدام requireالطريقة.

يمكننا الآن الوصول إلى resultطريقة addالكائن باستخدام .عامل النقطة:

//---- Main file[main.js] ---- const add = require('./calculate') const result = add.result(5,8) console.log(result) //Output : 13 

هناك طريقة أخرى يمكننا من خلالها تصدير الكائن أعلاه عن طريق تصدير الطريقة التي نطلبها فقط بدلاً من تصدير الكائن بأكمله.

//---- Exported file [calculate.js] ---- const add = { result : (a,b)=>{ return a + b } } module.exports = add.result 

كما ترى ، نقوم باستيراد resultالطريقة في addالكائن. لذلك يمكن استدعاء هذه الطريقة مباشرة في الملف الرئيسي.

هذه ممارسة جيدة إذا كنت لا تحتاج إلى الكائن بأكمله ولكنك تتطلب فقط بعض الأساليب / الوظائف الخاصة به. كما أنه يجعل الكود الخاص بنا أكثر أمانًا.

//---- Main file[main.js] ---- const add = require('./calculate') const result = add(5,8) console.log(result) //Output : 13 

كيفية استيراد مُنشئ دالة:

يتم استخدام مُنشئ الوظيفة بشكل أساسي لإنشاء مثيل جديد لكائن يمتلك نفس خصائص الكائن / الوظيفة الرئيسية.

في الحالة أدناه ، نقوم بإنشاء مثيل جديد للكائن "إضافة" باستخدام newالكلمة الأساسية. تسمى هذه العملية حيث نقوم بإنشاء مثيل لكائن "إنشاء مثيل".

ثم نقوم بتصدير هذا المثال باستخدام module.exports:

//---- Exported file [calculate.js] ---- function Add (){ this.result = (a,b)=>{ return a + b } } module.exports = new Add() 

الآن يمكننا استيراده إلى ملفنا الرئيسي والوصول إلى طريقة "النتيجة" بداخله ، للحصول على القيمة المحسوبة لدينا.

//---- Main file[main.js] ---- const add = require('./calculate2') const result = add.result(1,3) console.log(result); //Output : 4 

بهذه الطريقة يمكننا تصدير واستيراد مُنشئ دالة.

هناك طريقة أخرى يمكننا من خلالها القيام بذلك ، وهي عن طريق إنشاء مثيلنا الجديد في الملف الرئيسي بدلاً من الملف المصدر كما هو موضح أعلاه module.exports = new Add().

سنرى كيف يعمل هذا عندما نقوم بتصدير فئات ES6 التي تعمل بشكل مشابه لمنشئي الوظائف.

كيفية استيراد فئات ES6

classهي نوع خاص من الوظائف حيث classتساعد الكلمة الرئيسية في تهيئتها. يستخدم constructorطريقة لتخزين الخصائص.

الآن سنقوم بتصدير كامل classباستخدام module.exports:

//---- Exported file [calculate.js] ---- const Add = class{ constructor(a,b){ this.a = a; this.b = b; } result(){ return this.a + this.b } } module.exports = Add; 

الآن في ملفنا الرئيسي ، نقوم بإنشاء مثيل جديد باستخدام newالكلمة الأساسية والوصول إلى resultالطريقة للحصول على القيمة المحسوبة لدينا.

 //---- Main file[main.js] ---- const add = require('./calculate') const result = new add(2,5) console.log(result.result()); //Output : 7 

كيفية استيراد وحدات Node Core (الأصلية)

بدلاً من إنشاء وحدات مخصصة خاصة بنا في كل مرة ، توفر Node مجموعة من الوحدات لجعل حياتنا أسهل.

سنناقش بعض الوحدات النمطية ، ولكن يمكنك العثور على القائمة الكاملة في مستند Node API الرسمي هنا.

يتشابه استيراد وحدات العقدة مع كيفية استيراد الوحدات النمطية الخاصة بك. يمكنك استخدام نفس require()الوظيفة للوصول إليها في ملفك الخاص.

ولكن هناك بعض الوحدات التي ربما تكون قد استخدمتها دون علم منك ولا تحتاج إلى استيرادها. على سبيل المثال console.log()- لقد استخدمنا consoleالوحدة عدة مرات دون إحضارها في ملفنا المحلي لأن هذه الطرق متاحة عالميًا .

دعنا نلقي نظرة على إحدى الوحدات الأساسية الأصلية وهي نظام الملفات ( fs).

هناك عدد من العمليات التي يمكننا إجراؤها باستخدام وحدة نظام الملفات مثل قراءة ملف وكتابة ملف وتحديثه ، على سبيل المثال لا الحصر.

سنستخدم fsالوحدة لقراءة ملف. حتى في هذه الطريقة ، هناك طريقتان يمكننا من خلالهما تنفيذ هذا الإجراء: إحداهما باستخدام الوظيفة المتزامنة fs.readFileSync()، والأخرى عن طريق الوظيفة غير المتزامنة fs.readFile().

We'll discuss synchronous-asynchronous Node functions in future posts.

Today, we'll use the asynchronous version, that is fs.readFile().

For this example, we have created two files: main.js, where we are going to perform the file reading operation, and file.txt which is the file we are going to read.

image.png

Thefile.txt contains some text in it.

Hello World!

Now, we use the fs module to read the file, without importing it, as shown below:

fs.readFile('./file.txt','utf-8',(err,data)=>{ if (err) throw err console.log(data); })

It will throw an error as fs is not defined. That is because the file system fs module is not available globally like the console module is.

ReferenceError: fs is not defined at Object. (C:\Users\Sarvesh Kadam\Desktop\Training\blog\code snippets\Node Modular Pattern\main.js:3:1) at Module._compile (internal/modules/cjs/loader.js:1256:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:1277:10) at Module.load (internal/modules/cjs/loader.js:1105:32) at Function.Module._load (internal/modules/cjs/loader.js:967:14) at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:60:12) at internal/main/run_main_module.js:17:47 

Therefore, we need to import all the data from the file system module using the require() function and store all that data in a variable fs.

const fs = require('fs') fs.readFile('./file.txt','utf-8',(err,data)=>{ if (err) throw err console.log(data); })

Now you can name that variable anything. I named it fs for readability and it's the standard which most developers follow.

Using the fs variable we can access the readFile() method where we passed three arguments Those arguments are file path, character encoding utf-8, and the callback function to give an output.

You might ask why we're passing utf-8 as our argument in the readFile()?

Because it encodes the value and gives the text as an output rather than giving a buffer as shown below:

The callback function, in turn, has two arguments: an error (err) and the actual content in the file (data). Then we print that data in the console.

//Output: Hello World! 

How to Import NPM Modules

So what exactly is Node Package Manager?

الحزمة هي جزء من الكود الذي يديره مدير الحزم. إنه ليس سوى برنامج يدير تثبيت الحزم وتحديثها.

NPM حسب الوثائق الرسمية:

NPM هو أكبر سجل برمجيات في العالم. يستخدم مطورو البرامج مفتوحة المصدر من كل قارة npm لمشاركة واستعارة الحزم والعديد من المؤسسات تستخدم npm لإدارة التطوير الخاص أيضًا.

لذلك ، في NPM ، نستخدم كود مفتوح المصدر لشخص آخر تديره NPM عن طريق استيراده إلى مشروعنا.

عادةً ما يأتي NPM مع Node JS عند تنزيله. يمكنك التحقق مما إذا كان NPM مثبتًا على جهازك ببساطة عن طريق تشغيل الأمر npm -vفي موجه الأوامر. إذا قام بإرجاع بعض رقم الإصدار ، فهذا يعني أنه تم تثبيت NPM بنجاح.

لدى NPM سجله في npmjs.com حيث يمكنك اكتشاف الحزم التي يمكنك استخدامها.

Let's look at one of the packages called chalk which is basically used for terminal styling.

chalknpm2.jpg

In the above figure, we can see the weekly downloads of the package which suggests how popular is it.

Also, you can see that this package has dependencies in it. So this module which will serve as a dependency on our project is itself dependent on other modules.

This entire management process is taken care of by the Package Manager.

Even the source code is which is present on GitHub is given to us. We can navigate to it and verify if there are any open issues present.

One more thing before moving forward: the NPM packages come in different versions. The pattern which the version follows is semantic versioning.

As you can see, the latest version of the chalk module when I wrote this article is 4.1.0.

It follows the semantic versioning Major_changes.Minor_changes.Patch pattern.

Major_changes, as the name stands, are the significant changes made on the module which might affect your existing code.

Minor_changes are new enhancements or features along with defect fixes that have been added which should not affect your existing code.

Patch is the small bug fixes that will not crash your existing code.

You can learn more about semantic versioning on semver.org.

How to Install NPM

Now to import any package from NPM, you first need to initialize NPM on your local project folder by running the command on the command prompt:

npm init 

Once you run the above command, it will ask you for some data as shown below such as package name, version, and so on.

Much of this data can be kept as default as mentioned in the Round brackets ().

Also, the fields such as author and license are for the folks who created those NPM packages.

On the other hand, we are just importing and using them to create our own application.

package name: (code_npm) code_npm version: (1.0.0) 1.0.0 description: npm demo entry point: (index.js) index.js test command: test git repository: keywords: npm test author: Sarvesh license: (ISC) 

Once you enter all the fields, it will create a JSON file with values that have the above properties, and it'll ask you for confirmation like this:

Is this OK? (yes) yes 

Once you've confirmed yes it will create a package.json file with all the data you entered as illustrated below:

{ "name": "code_npm", "version": "1.0.0", "description": "npm demo", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [ "npm", "test" ], "author": "Sarvesh", "license": "ISC" } 

Also, you can see a script object that has a test property added. You can run it using the npm test command and it will give back the desired output like this:

"Error: no test specified" 

Now instead of doing this elongated method of initializing NPM and entering the custom properties values, you can simply run the command:

npm init -y 

Once you run this command, it will directly create a package.json file with the default values.

Pkgjson.PNG

Now to install the latest version of the chalk package in your project, you need to execute the command:

npm install chalk 

You can also install any specific version you need of chalk by just adding @version number as shown below. Also instead of install you can simply put the short-hand i flag which stands for installation:

npm i [email protected] 

This will install two things, a node_modules folder, and a package-lock.json file.

folderdir.PNG

Also, it will add a new property called dependencies to our package.json file which contains the name of the package installed and its version.

"dependencies": { "chalk": "^4.0.0" } 

The node_module folder contains the packages folder and its dependency's folders. It gets modifies as and when the npm package gets installed.

The package-lock.json contains the code which makes NPM faster and more secure.

"chalk": { "version": "4.0.0", "resolved": "//registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } 

It mainly contains properties such as version, which is the semantic version number.

The resolved property is the directory or location from which the package was fetched. In this case it was fetched from chalk.

The integrity property is to make sure that we get the same code if we install the dependency again.

The requires object property represents the dependency of the chalk package.

Note: Do not make any changes to these two files node_modules and package-lock.json

How to Use NPM

Now once we've installed chalk to our project, we can import it to our root project file using the require() method. Then we can store that module in a variable called chalk.

const chalk = require('chalk') console.log(chalk.red("Hello World"))

Using the red() method of the chalk package, we have styled the "Hello World" text color in red.

On running the command node index.js we get the following output:

chalkop.png

Now there are many ways you can style your command line output using the chalk package. For more information you can refer to the Chalk official document on NPM.

Also, you can install the NPM packages globally (that is, on our operating system) rather than installing it in your local project by adding the -g flag on the command line (which stands for global, as mentioned below):

npm i nodemon -g 

This global package will not affect our package.json in any way since it is not installed locally.

We have installed the nodemon package globally which is used for automatic restart of a Node application when file changes in the directory are observed.

You can refer to nodemon for more information.

We can use the nodemon package by running the application using this command:

nodemon index.js 

It works similarly to node index.js, except it keeps an eye on the file changes and it restarts the application once changes are detected.

[nodemon] 2.0.6 [nodemon] to restart at any time, enter `rs` [nodemon] watching path(s): *.* [nodemon] watching extensions: js,mjs,json [nodemon] starting `node index.js` Hello World 

Note: The chalk styling will probably not work when you used nodemon.

Finally, we will go through the dev dependencies. There are some NPM packages or modules which we won't need in our project's production environment, but only for our development requirements.

We can install these modules in our project using the dev flag as shown below:

 npm i nodemon --save-dev 

It then creates a new property in the package.json called devDependencies:

"devDependencies": { "nodemon": "^2.0.6" } 

Conclusion

Using Node's Module Pattern, we can import from our own files by exporting them in form of functions, objects, function constructors, and ES6 classes.

And Node has its own set of Core (Native) Modules which we can use. Some of them are available globally, while some of them need to be imported locally in your project/folder.

NPM is a package manager that manages 3rd party open source code which we can use in our project. Before using NPM modules, you need to initialize NPM locally using npm init on your command line in the root of your project folder.

يمكنك تثبيت أي حزمة NPM باستخدام الأمر npm i . ويمكنك تثبيت حزمة NPM عالميًا باستخدام -gالعلم. كما يمكن جعل الحزمة تعتمد على التطوير باستخدام --save-devالعلم.

شكرا لقرائتك! إذا أعجبك هذا المقال ، فتواصل معي على Twitter بينما أستمر في توثيق تعليمي.