తెలుగు

ఫైన్-గ్రైన్డ్ రియాక్టివిటీ ద్వారా అద్భుతమైన పనితీరును అందించే ఆధునిక జావాస్క్రిప్ట్ ఫ్రేమ్‌వర్క్ సాలిడ్‌జేఎస్ గురించి అన్వేషించండి. దాని ప్రధాన భావనలు, ప్రయోజనాలు మరియు ఇతర ఫ్రేమ్‌వర్క్‌లతో పోలికలను తెలుసుకోండి.

సాలిడ్‌జేఎస్: ఫైన్-గ్రైన్డ్ రియాక్టివ్ వెబ్ ఫ్రేమ్‌వర్క్‌పై ఒక లోతైన విశ్లేషణ

నిరంతరం అభివృద్ధి చెందుతున్న వెబ్ డెవలప్‌మెంట్ రంగంలో, సమర్థవంతమైన, స్కేలబుల్ మరియు నిర్వహించదగిన అప్లికేషన్‌లను రూపొందించడానికి సరైన ఫ్రేమ్‌వర్క్‌ను ఎంచుకోవడం చాలా ముఖ్యం. సాలిడ్‌జేఎస్ ఒక ఆకర్షణీయమైన ఎంపికగా ఉద్భవించింది, ఇది రియాక్టివిటీ మరియు పనితీరుకు ఒక ప్రత్యేకమైన విధానాన్ని అందిస్తుంది. ఈ వ్యాసం సాలిడ్‌జేఎస్ యొక్క సమగ్ర అవలోకనాన్ని అందిస్తుంది, దాని ప్రధాన భావనలు, ప్రయోజనాలు, వినియోగ సందర్భాలు, మరియు ఇతర ప్రసిద్ధ ఫ్రేమ్‌వర్క్‌లతో పోలికలను వివరిస్తుంది.

సాలిడ్‌జేఎస్ అంటే ఏమిటి?

సాలిడ్‌జేఎస్ అనేది యూజర్ ఇంటర్‌ఫేస్‌లను నిర్మించడానికి ఒక డిక్లరేటివ్, సమర్థవంతమైన మరియు సరళమైన జావాస్క్రిప్ట్ లైబ్రరీ. ర్యాన్ కార్నియాటోచే సృష్టించబడిన ఇది, దాని ఫైన్-గ్రైన్డ్ రియాక్టివిటీ మరియు వర్చువల్ DOM లేకపోవడం ద్వారా ప్రత్యేకంగా నిలుస్తుంది, ఫలితంగా అసాధారణమైన పనితీరు మరియు తక్కువ రన్‌టైమ్‌ను అందిస్తుంది. వర్చువల్ DOM డిఫింగ్‌పై ఆధారపడే ఫ్రేమ్‌వర్క్‌ల వలె కాకుండా, సాలిడ్‌జేఎస్ మీ టెంప్లేట్‌లను అత్యంత సమర్థవంతమైన DOM అప్‌డేట్‌లుగా కంపైల్ చేస్తుంది. ఇది డేటా ఇమ్మ్యూటబిలిటీ మరియు సిగ్నల్స్‌కు ప్రాధాన్యత ఇస్తుంది, ఇది ఊహించదగినదిగా మరియు పనితీరులో ఉత్తమంగా ఉండే ఒక రియాక్టివ్ సిస్టమ్‌ను అందిస్తుంది.

ముఖ్య లక్షణాలు:

సాలిడ్‌జేఎస్ యొక్క ప్రధాన భావనలు

ఫ్రేమ్‌వర్క్‌తో అప్లికేషన్‌లను సమర్థవంతంగా నిర్మించడానికి సాలిడ్‌జేఎస్ యొక్క ప్రధాన భావనలను అర్థం చేసుకోవడం చాలా అవసరం:

1. సిగ్నల్స్

సిగ్నల్స్ సాలిడ్‌జేఎస్ రియాక్టివిటీ సిస్టమ్ యొక్క ప్రాథమిక బిల్డింగ్ బ్లాక్స్. అవి రియాక్టివ్ విలువను కలిగి ఉంటాయి మరియు ఆ విలువ మారినప్పుడు ఏవైనా ఆధారిత కంప్యూటేషన్‌లకు తెలియజేస్తాయి. వీటిని రియాక్టివ్ వేరియబుల్స్‌గా భావించండి. మీరు createSignal ఫంక్షన్‌ను ఉపయోగించి సిగ్నల్‌ను సృష్టిస్తారు:

import { createSignal } from 'solid-js';

const [count, setCount] = createSignal(0);

console.log(count()); // Access the value
setCount(1);       // Update the value

createSignal ఫంక్షన్ రెండు ఫంక్షన్‌లతో కూడిన ఒక అర్రేను తిరిగి ఇస్తుంది: సిగ్నల్ యొక్క ప్రస్తుత విలువను యాక్సెస్ చేయడానికి ఒక గెట్టర్ ఫంక్షన్ (ఉదాహరణలో count()) మరియు విలువను అప్‌డేట్ చేయడానికి ఒక సెట్టర్ ఫంక్షన్ (setCount()). సెట్టర్ ఫంక్షన్‌ను కాల్ చేసినప్పుడు, అది సిగ్నల్‌పై ఆధారపడిన ఏవైనా కాంపోనెంట్స్ లేదా కంప్యూటేషన్‌లలో అప్‌డేట్‌లను ఆటోమేటిక్‌గా ప్రేరేపిస్తుంది.

2. ఎఫెక్ట్స్

ఎఫెక్ట్స్ అనేవి సిగ్నల్స్‌లోని మార్పులకు ప్రతిస్పందించే ఫంక్షన్‌లు. DOM ను అప్‌డేట్ చేయడం, API కాల్స్ చేయడం లేదా డేటాను లాగింగ్ చేయడం వంటి సైడ్ ఎఫెక్ట్స్ చేయడానికి వీటిని ఉపయోగిస్తారు. మీరు createEffect ఫంక్షన్‌ను ఉపయోగించి ఒక ఎఫెక్ట్‌ను సృష్టిస్తారు:

import { createSignal, createEffect } from 'solid-js';

const [name, setName] = createSignal('World');

createEffect(() => {
  console.log(`Hello, ${name()}!`); // This will run whenever 'name' changes
});

setName('SolidJS'); // Output: Hello, SolidJS!

ఈ ఉదాహరణలో, ఎఫెక్ట్ ఫంక్షన్ మొదట మరియు name సిగ్నల్ మారినప్పుడల్లా రన్ అవుతుంది. సాలిడ్‌జేఎస్ ఎఫెక్ట్‌లో ఏ సిగ్నల్స్ చదవబడ్డాయో ఆటోమేటిక్‌గా ట్రాక్ చేస్తుంది మరియు ఆ సిగ్నల్స్ అప్‌డేట్ అయినప్పుడు మాత్రమే ఎఫెక్ట్‌ను మళ్లీ రన్ చేస్తుంది.

3. మెమోస్

మెమోస్ అనేవి వాటి డిపెండెన్సీలు మారినప్పుడు ఆటోమేటిక్‌గా అప్‌డేట్ చేయబడే డిరైవ్డ్ విలువలు. ఖరీదైన కంప్యూటేషన్‌ల ఫలితాలను కాష్ చేయడం ద్వారా పనితీరును ఆప్టిమైజ్ చేయడానికి ఇవి ఉపయోగపడతాయి. మీరు createMemo ఫంక్షన్‌ను ఉపయోగించి ఒక మెమోను సృష్టిస్తారు:

import { createSignal, createMemo } from 'solid-js';

const [firstName, setFirstName] = createSignal('John');
const [lastName, setLastName] = createSignal('Doe');

const fullName = createMemo(() => `${firstName()} ${lastName()}`);

console.log(fullName()); // Output: John Doe

setFirstName('Jane');
console.log(fullName()); // Output: Jane Doe

firstName లేదా lastName సిగ్నల్ మారినప్పుడల్లా fullName మెమో ఆటోమేటిక్‌గా అప్‌డేట్ అవుతుంది. సాలిడ్‌జేఎస్ మెమో ఫంక్షన్ యొక్క ఫలితాన్ని సమర్థవంతంగా కాష్ చేస్తుంది మరియు అవసరమైనప్పుడు మాత్రమే దానిని మళ్లీ రన్ చేస్తుంది.

4. కాంపోనెంట్స్

కాంపోనెంట్స్ అనేవి UI లాజిక్ మరియు ప్రెజెంటేషన్‌ను కలిగి ఉండే పునర్వినియోగ బిల్డింగ్ బ్లాక్స్. సాలిడ్‌జేఎస్ కాంపోనెంట్స్ JSX ఎలిమెంట్స్‌ను తిరిగి ఇచ్చే సాధారణ జావాస్క్రిప్ట్ ఫంక్షన్‌లు. అవి ప్రాప్స్ ద్వారా డేటాను స్వీకరిస్తాయి మరియు సిగ్నల్స్‌ను ఉపయోగించి తమ సొంత స్టేట్‌ను నిర్వహించగలవు.

import { createSignal } from 'solid-js';
import { render } from 'solid-js/web';

function Counter() {
  const [count, setCount] = createSignal(0);

  return (
    <div>
      <p>Count: {count()}</p>
      <button onClick={() => setCount(count() + 1)}>Increment</button>
    </div>
  );
}

render(() => <Counter />, document.getElementById('root'));

ఈ ఉదాహరణ తన స్టేట్‌ను నిర్వహించడానికి ఒక సిగ్నల్‌ను ఉపయోగించే ఒక సాధారణ కౌంటర్ కాంపోనెంట్‌ను ప్రదర్శిస్తుంది. బటన్‌ను క్లిక్ చేసినప్పుడు, setCount ఫంక్షన్ కాల్ చేయబడుతుంది, ఇది సిగ్నల్‌ను అప్‌డేట్ చేస్తుంది మరియు కాంపోనెంట్ యొక్క రీ-రెండర్‌ను ప్రేరేపిస్తుంది.

సాలిడ్‌జేఎస్ ఉపయోగించడం వల్ల ప్రయోజనాలు

సాలిడ్‌జేఎస్ వెబ్ డెవలపర్‌లకు అనేక ముఖ్యమైన ప్రయోజనాలను అందిస్తుంది:

1. అసాధారణమైన పనితీరు

సాలిడ్‌జేఎస్ యొక్క ఫైన్-గ్రైన్డ్ రియాక్టివిటీ మరియు వర్చువల్ DOM లేకపోవడం అద్భుతమైన పనితీరుకు దారితీస్తుంది. బెంచ్‌మార్క్‌లు నిరంతరం చూపిస్తున్నాయి, రెండరింగ్ వేగం, మెమరీ వాడకం, మరియు అప్‌డేట్ సామర్థ్యం పరంగా సాలిడ్‌జేఎస్ ఇతర ప్రసిద్ధ ఫ్రేమ్‌వర్క్‌లను అధిగమిస్తుంది. ఇది తరచుగా డేటా అప్‌డేట్‌లతో కూడిన సంక్లిష్టమైన అప్లికేషన్‌లలో ప్రత్యేకంగా గమనించవచ్చు.

2. చిన్న బండిల్ సైజు

సాలిడ్‌జేఎస్ చాలా చిన్న బండిల్ సైజును కలిగి ఉంది, సాధారణంగా 10KB gzipped కంటే తక్కువ. ఇది పేజీ లోడ్ సమయాలను తగ్గిస్తుంది మరియు మొత్తం యూజర్ అనుభవాన్ని మెరుగుపరుస్తుంది, ముఖ్యంగా పరిమిత బ్యాండ్‌విడ్త్ లేదా ప్రాసెసింగ్ పవర్ ఉన్న పరికరాలలో. చిన్న బండిల్స్ మెరుగైన SEO మరియు యాక్సెసిబిలిటీకి కూడా దోహదం చేస్తాయి.

3. సరళమైన మరియు ఊహించదగిన రియాక్టివిటీ

సాలిడ్‌జేఎస్ రియాక్టివిటీ సిస్టమ్ సరళమైన మరియు ఊహించదగిన ప్రిమిటివ్‌లపై ఆధారపడి ఉంటుంది, ఇది అప్లికేషన్ ప్రవర్తనను అర్థం చేసుకోవడానికి మరియు దాని గురించి తర్కించడానికి సులభం చేస్తుంది. సిగ్నల్స్, ఎఫెక్ట్స్, మరియు మెమోస్ యొక్క డిక్లరేటివ్ స్వభావం ఒక క్లీన్ మరియు నిర్వహించదగిన కోడ్‌బేస్‌ను ప్రోత్సహిస్తుంది.

4. అద్భుతమైన టైప్‌స్క్రిప్ట్ సపోర్ట్

సాలిడ్‌జేఎస్ టైప్‌స్క్రిప్ట్‌లో వ్రాయబడింది మరియు అద్భుతమైన టైప్‌స్క్రిప్ట్ సపోర్ట్‌ను కలిగి ఉంది. ఇది టైప్ సేఫ్టీ, మెరుగైన డెవలపర్ అనుభవాన్ని అందిస్తుంది మరియు రన్‌టైమ్ ఎర్రర్‌ల సంభావ్యతను తగ్గిస్తుంది. టైప్‌స్క్రిప్ట్ పెద్ద ప్రాజెక్ట్‌లలో సహకరించడానికి మరియు కాలక్రమేణా కోడ్‌ను నిర్వహించడానికి కూడా సులభతరం చేస్తుంది.

5. సుపరిచితమైన సింటాక్స్

సాలిడ్‌జేఎస్ టెంప్లేటింగ్ కోసం JSX ను ఉపయోగిస్తుంది, ఇది రియాక్ట్‌తో పనిచేసిన డెవలపర్‌లకు సుపరిచితం. ఇది నేర్చుకునే సమయాన్ని తగ్గిస్తుంది మరియు ఇప్పటికే ఉన్న ప్రాజెక్ట్‌లలో సాలిడ్‌జేఎస్‌ను స్వీకరించడాన్ని సులభతరం చేస్తుంది.

6. సర్వర్-సైడ్ రెండరింగ్ (SSR) మరియు స్టాటిక్ సైట్ జనరేషన్ (SSG)

సాలిడ్‌జేఎస్ సర్వర్-సైడ్ రెండరింగ్ (SSR) మరియు స్టాటిక్ సైట్ జనరేషన్ (SSG) లకు మద్దతు ఇస్తుంది, ఇది SEO మరియు ప్రారంభ పేజీ లోడ్ సమయాలను మెరుగుపరుస్తుంది. సాలిడ్ స్టార్ట్ వంటి అనేక లైబ్రరీలు మరియు ఫ్రేమ్‌వర్క్‌లు, SSR మరియు SSG అప్లికేషన్‌లను నిర్మించడానికి సాలిడ్‌జేఎస్‌తో అతుకులు లేని ఇంటిగ్రేషన్‌ను అందిస్తాయి.

సాలిడ్‌జేఎస్ కోసం వినియోగ సందర్భాలు

సాలిడ్‌జేఎస్ వివిధ రకాల వెబ్ డెవలప్‌మెంట్ ప్రాజెక్ట్‌లకు బాగా సరిపోతుంది, వాటిలో ఇవి ఉన్నాయి:

1. సంక్లిష్టమైన యూజర్ ఇంటర్‌ఫేస్‌లు

సాలిడ్‌జేఎస్ యొక్క పనితీరు మరియు రియాక్టివిటీ డాష్‌బోర్డ్‌లు, డేటా విజువలైజేషన్‌లు, మరియు ఇంటరాక్టివ్ అప్లికేషన్‌లు వంటి తరచుగా డేటా అప్‌డేట్‌లతో కూడిన సంక్లిష్టమైన యూజర్ ఇంటర్‌ఫేస్‌లను నిర్మించడానికి ఇది ఒక అద్భుతమైన ఎంపిక. ఉదాహరణకు, నిరంతరం మారుతున్న మార్కెట్ డేటాను ప్రదర్శించాల్సిన రియల్-టైమ్ స్టాక్ ట్రేడింగ్ ప్లాట్‌ఫారమ్‌ను పరిగణించండి. సాలిడ్‌జేఎస్ యొక్క ఫైన్-గ్రైన్డ్ రియాక్టివిటీ UI యొక్క అవసరమైన భాగాలు మాత్రమే అప్‌డేట్ చేయబడతాయని నిర్ధారిస్తుంది, ఇది సున్నితమైన మరియు ప్రతిస్పందించే యూజర్ అనుభవాన్ని అందిస్తుంది.

2. పనితీరు-క్లిష్టమైన అప్లికేషన్‌లు

పనితీరు అనేది అత్యంత ప్రాధాన్యత అయితే, సాలిడ్‌జేఎస్ ఒక బలమైన పోటీదారు. దాని ఆప్టిమైజ్ చేయబడిన DOM అప్‌డేట్‌లు మరియు చిన్న బండిల్ సైజు వెబ్ అప్లికేషన్‌ల పనితీరును గణనీయంగా మెరుగుపరుస్తాయి, ముఖ్యంగా వనరులు-పరిమిత పరికరాలలో. ఆన్‌లైన్ గేమ్‌లు లేదా వీడియో ఎడిటింగ్ టూల్స్ వంటి అధిక ప్రతిస్పందన మరియు కనీస జాప్యం అవసరమయ్యే అప్లికేషన్‌లకు ఇది చాలా ముఖ్యం.

3. చిన్న నుండి మధ్య-స్థాయి ప్రాజెక్ట్‌లు

సాలిడ్‌జేఎస్ యొక్క సరళత మరియు చిన్న ఫుట్‌ప్రింట్ డెవలపర్ ఉత్పాదకత మరియు నిర్వహణ సామర్థ్యం ముఖ్యమైన చిన్న నుండి మధ్య-స్థాయి ప్రాజెక్ట్‌లకు మంచి ఎంపికగా చేస్తాయి. దాని సులభమైన అభ్యాసం మరియు వాడకం డెవలపర్‌లకు పెద్ద, మరింత సంక్లిష్టమైన ఫ్రేమ్‌వర్క్‌ల ఓవర్‌హెడ్ లేకుండా అప్లికేషన్‌లను త్వరగా నిర్మించి, అమలు చేయడానికి సహాయపడుతుంది. ఒక స్థానిక వ్యాపారం కోసం సింగిల్-పేజ్ అప్లికేషన్ నిర్మించడాన్ని ఊహించుకోండి – సాలిడ్‌జేఎస్ ఒక క్రమబద్ధమైన మరియు సమర్థవంతమైన అభివృద్ధి అనుభవాన్ని అందిస్తుంది.

4. ప్రోగ్రెసివ్ ఎన్‌హాన్స్‌మెంట్

సాలిడ్‌జేఎస్‌ను ప్రోగ్రెసివ్ ఎన్‌హాన్స్‌మెంట్ కోసం ఉపయోగించవచ్చు, పూర్తి రీరైట్ అవసరం లేకుండా ఇప్పటికే ఉన్న వెబ్‌సైట్‌లకు క్రమంగా ఇంటరాక్టివిటీ మరియు కార్యాచరణను జోడించవచ్చు. ఇది డెవలపర్‌లకు లెగసీ అప్లికేషన్‌లను ఆధునీకరించడానికి మరియు పూర్తి మైగ్రేషన్‌తో సంబంధం ఉన్న ఖర్చులు మరియు నష్టాలను భరించకుండా యూజర్ అనుభవాన్ని మెరుగుపరచడానికి అనుమతిస్తుంది. ఉదాహరణకు, స్టాటిక్ HTML తో నిర్మించిన ఇప్పటికే ఉన్న వెబ్‌సైట్‌కు డైనమిక్ సెర్చ్ ఫీచర్‌ను జోడించడానికి మీరు సాలిడ్‌జేఎస్‌ను ఉపయోగించవచ్చు.

సాలిడ్‌జేఎస్ vs. ఇతర ఫ్రేమ్‌వర్క్‌లు

సాలిడ్‌జేఎస్ యొక్క బలాలు మరియు బలహీనతలను అర్థం చేసుకోవడానికి ఇతర ప్రసిద్ధ ఫ్రేమ్‌వర్క్‌లతో పోల్చడం సహాయకరంగా ఉంటుంది:

సాలిడ్‌జేఎస్ vs. రియాక్ట్

సాలిడ్‌జేఎస్ vs. వ్యూ.జేఎస్

సాలిడ్‌జేఎస్ vs. స్వెల్ట్

సాలిడ్‌జేఎస్‌తో ప్రారంభించడం

సాలిడ్‌జేఎస్‌తో ప్రారంభించడం చాలా సులభం:

1. మీ డెవలప్‌మెంట్ ఎన్విరాన్‌మెంట్‌ను సెటప్ చేయడం

మీ మెషీన్‌లో మీకు Node.js మరియు npm (లేదా yarn) ఇన్‌స్టాల్ చేయబడి ఉండాలి. ఆ తర్వాత, మీరు ఒక కొత్త సాలిడ్‌జేఎస్ ప్రాజెక్ట్‌ను త్వరగా రూపొందించడానికి ఒక టెంప్లేట్‌ను ఉపయోగించవచ్చు:

npx degit solidjs/templates/ts my-solid-app
cd my-solid-app
npm install
npm run dev

ఇది my-solid-app డైరెక్టరీలో ఒక కొత్త సాలిడ్‌జేఎస్ ప్రాజెక్ట్‌ను సృష్టిస్తుంది, అవసరమైన డిపెండెన్సీలను ఇన్‌స్టాల్ చేస్తుంది, మరియు డెవలప్‌మెంట్ సర్వర్‌ను ప్రారంభిస్తుంది.

2. ప్రాథమిక అంశాలను నేర్చుకోవడం

అధికారిక సాలిడ్‌జేఎస్ డాక్యుమెంటేషన్ మరియు ట్యుటోరియల్స్‌ను అన్వేషించడం ద్వారా ప్రారంభించండి. సిగ్నల్స్, ఎఫెక్ట్స్, మెమోస్, మరియు కాంపోనెంట్స్ యొక్క ప్రధాన భావనలతో పరిచయం పెంచుకోండి. మీ అవగాహనను పటిష్టం చేసుకోవడానికి చిన్న అప్లికేషన్‌లను నిర్మించి ప్రయోగం చేయండి.

3. కమ్యూనిటీకి సహకరించడం

సాలిడ్‌జేఎస్ కమ్యూనిటీ చురుకుగా మరియు స్వాగతించేదిగా ఉంటుంది. సాలిడ్‌జేఎస్ డిస్కార్డ్ సర్వర్‌లో చేరండి, చర్చలలో పాల్గొనండి, మరియు ఓపెన్-సోర్స్ ప్రాజెక్ట్‌లకు సహకరించండి. మీ జ్ఞానం మరియు అనుభవాలను పంచుకోవడం మీరు ఒక సాలిడ్‌జేఎస్ డెవలపర్‌గా నేర్చుకోవడానికి మరియు ఎదగడానికి సహాయపడుతుంది.

ఆచరణలో సాలిడ్‌జేఎస్ ఉదాహరణలు

సాలిడ్‌జేఎస్ సాపేక్షంగా కొత్త ఫ్రేమ్‌వర్క్ అయినప్పటికీ, ఇది ఇప్పటికే వివిధ రకాల అప్లికేషన్‌లను నిర్మించడానికి ఉపయోగించబడుతోంది. ఇక్కడ కొన్ని ముఖ్యమైన ఉదాహరణలు ఉన్నాయి:

ముగింపు

సాలిడ్‌జేఎస్ ఒక శక్తివంతమైన మరియు ఆశాజనకమైన జావాస్క్రిప్ట్ ఫ్రేమ్‌వర్క్, ఇది అసాధారణమైన పనితీరు, చిన్న బండిల్ సైజు, మరియు ఒక సరళమైన ఇంకా ఊహించదగిన రియాక్టివిటీ సిస్టమ్‌ను అందిస్తుంది. దాని ఫైన్-గ్రైన్డ్ రియాక్టివిటీ మరియు వర్చువల్ DOM లేకపోవడం వలన సంక్లిష్టమైన యూజర్ ఇంటర్‌ఫేస్‌లు మరియు పనితీరు-క్లిష్టమైన అప్లికేషన్‌లను నిర్మించడానికి ఇది ఒక ఆకర్షణీయమైన ఎంపిక. దాని ఎకోసిస్టమ్ ఇంకా పెరుగుతున్నప్పటికీ, సాలిడ్‌జేఎస్ త్వరగా ప్రాచుర్యం పొందుతోంది మరియు వెబ్ డెవలప్‌మెంట్ రంగంలో ఒక ప్రధాన పాత్రధారిగా మారడానికి సిద్ధంగా ఉంది. మీ తదుపరి ప్రాజెక్ట్ కోసం సాలిడ్‌జేఎస్‌ను అన్వేషించడాన్ని పరిగణించండి మరియు దాని ప్రత్యేకమైన రియాక్టివిటీ మరియు పనితీరు విధానం యొక్క ప్రయోజనాలను అనుభవించండి.

మరింత తెలుసుకోవడానికి వనరులు