What is Node?

Course Overview

Pure Node.js

The history of Node.js

JavaScript and ES2015

Installation and basics

Less important parts of the API

External services

Node is popular!

  • Server side framework
  • Mobile and IoT
  • Desktop applications
  • Millions of users
  • Largest ecosystem

Node's popularity

This course

  • Intermediate Skills
  • Advanced Skills

What needs to improve?

  • The event-loop
  • V8 and the Call Stack
  • Sockets
  • Event Emitters
  • Streams
  • Clusters

How well do you know Node.js?

This course

Course Path

  • What is Node?
  • npm
  • Concurrency Model and Event Loop
  • Workshop #1
  • Node's Event-driven Architecture
  • Node for Networking
  • Node for Web
  • Node's Common Built-in Libraries
  • Working with Streams
  • Clusters and Child Processes
  • Workshop #2
  • Express.js
  • Real-time Communication with Node.js

  • Testing
  • Workshop #3

  • API Documentation, Automation and Deployment

  • Debugging Node.js In Production

  • Node.js + TypeScript

  • Workshop #4

Architecture:

V8 and libuv

Node VMs

V8

$ node -v
v7.7.4

$ node -p 'process.versions.v8'
5.5.372.42

V8 Feature groups

Shipping

Staged

In progress

--harmony

$ node -p "'Node'.padEnd(8, '*')"
[eval]:1
'Node'.padEnd(8, '*')
       ^

TypeError: "Node".padEnd is not a function
    at [eval]:1:8
    at ContextifyScript.Script.runInThisContext (vm.js:23:33)
    at Object.runInThisContext (vm.js:95:38)
    at Object.<anonymous> ([eval]-wrapper:6:22)
    at Module._compile (module.js:571:32)
    at Immediate.<anonymous> (bootstrap_node.js:392:29)
    at runCallback (timers.js:666:20)
    at tryOnImmediate (timers.js:639:5)
    at processImmediate [as _immediateCallback] (timers.js:611:5)



$ node --harmony -p "'Node'.padEnd(8, '*')"
Node****
$ node --v8-options | grep "in progress"
  --harmony_array_prototype_values (enable "harmony Array.prototype.values" (in progress))
  --harmony_function_sent (enable "harmony function.sent" (in progress))
  --harmony_sharedarraybuffer (enable "harmony sharedarraybuffer" (in progress))
  --harmony_simd (enable "harmony simd" (in progress))
  --harmony_do_expressions (enable "harmony do-expressions" (in progress))
  --harmony_restrictive_generators (enable "harmony restrictions on generator declarations" (in progress))
  --harmony_regexp_named_captures (enable "harmony regexp named captures" (in progress))
  --harmony_regexp_property (enable "harmony unicode regexp property classes" (in progress))
  --harmony_for_in (enable "harmony for-in syntax" (in progress))
  --harmony_trailing_commas (enable "harmony trailing commas in function parameter lists" (in progress))
  --harmony_class_fields (enable "harmony public fields in class literals" (in progress))

Node’s CLI and REPL

Read

Eval

Print

Loop

node
> 3 == '3'
true
> var a = 2
undefined
>
>
Array                                Boolean                              Date                                 Error
EvalError                            Function                             Infinity                             JSON
Math                                 NaN                                  Number                               Object
RangeError                           ReferenceError                       RegExp                               String
SyntaxError                          TypeError                            URIError                             decodeURI
decodeURIComponent                   encodeURI                            encodeURIComponent                   eval
isFinite                             isNaN                                parseFloat                           parseInt
undefined                            

ArrayBuffer                          Buffer                               COUNTER_HTTP_CLIENT_REQUEST          COUNTER_HTTP_CLIENT_RESPONSE
COUNTER_HTTP_SERVER_REQUEST          COUNTER_HTTP_SERVER_RESPONSE         COUNTER_NET_SERVER_CONNECTION        COUNTER_NET_SERVER_CONNECTION_CLOSE
DTRACE_HTTP_CLIENT_REQUEST           DTRACE_HTTP_CLIENT_RESPONSE          DTRACE_HTTP_SERVER_REQUEST           DTRACE_HTTP_SERVER_RESPONSE
DTRACE_NET_SERVER_CONNECTION         DTRACE_NET_STREAM_END                DataView                             Float32Array
Float64Array                         GLOBAL                               Int16Array                           Int32Array
Int8Array                            Intl                                 Map                                  Promise
Proxy                                Reflect                              Set                                  Symbol
Uint16Array                          Uint32Array                          Uint8Array                           Uint8ClampedArray
WeakMap                              WeakSet                              _                                    a
assert                               buffer                               child_process                        clearImmediate
clearInterval                        clearTimeout                         cluster                              console
crypto                               dgram                                dns                                  domain
escape                               events                               fs                                   global
http                                 https                                module                               net
os                                   path                                 process                              punycode
querystring                          readline                             repl                                 require
root                                 setImmediate                         setInterval                          setTimeout
stream                               string_decoder                       tls                                  tty
unescape                             url                                  util                                 v8
vm                                   zlib                                 

__defineGetter__                     __defineSetter__                     __lookupGetter__                     __lookupSetter__
__proto__                            constructor                          hasOwnProperty                       isPrototypeOf
propertyIsEnumerable                 toLocaleString                       toString                             valueOf

>

Autocomplete - Double TAB

> global.
global.__defineGetter__                     global.__defineSetter__                     global.__lookupGetter__                     global.__lookupSetter__
global.__proto__                            global.constructor                          global.hasOwnProperty                       global.isPrototypeOf
global.propertyIsEnumerable                 global.toLocaleString                       global.toString                             global.valueOf

global.Array                                global.ArrayBuffer                          global.Boolean                              global.Buffer
global.COUNTER_HTTP_CLIENT_REQUEST          global.COUNTER_HTTP_CLIENT_RESPONSE         global.COUNTER_HTTP_SERVER_REQUEST          global.COUNTER_HTTP_SERVER_RESPONSE
global.COUNTER_NET_SERVER_CONNECTION        global.COUNTER_NET_SERVER_CONNECTION_CLOSE  global.DTRACE_HTTP_CLIENT_REQUEST           global.DTRACE_HTTP_CLIENT_RESPONSE
global.DTRACE_HTTP_SERVER_REQUEST           global.DTRACE_HTTP_SERVER_RESPONSE          global.DTRACE_NET_SERVER_CONNECTION         global.DTRACE_NET_STREAM_END
global.DataView                             global.Date                                 global.Error                                global.EvalError
global.Float32Array                         global.Float64Array                         global.Function                             global.GLOBAL
global.Infinity                             global.Int16Array                           global.Int32Array                           global.Int8Array
global.Intl                                 global.JSON                                 global.Map                                  global.Math
global.NaN                                  global.Number                               global.Object                               global.Promise
global.Proxy                                global.RangeError                           global.ReferenceError                       global.Reflect
global.RegExp                               global.Set                                  global.String                               global.Symbol
global.SyntaxError                          global.TypeError                            global.URIError                             global.Uint16Array
global.Uint32Array                          global.Uint8Array                           global.Uint8ClampedArray                    global.WeakMap
global.WeakSet                              global._                                    global.a                                    global.assert
global.buffer                               global.child_process                        global.clearImmediate                       global.clearInterval
global.clearTimeout                         global.cluster                              global.console                              global.crypto
global.decodeURI                            global.decodeURIComponent                   global.dgram                                global.dns
global.domain                               global.encodeURI                            global.encodeURIComponent                   global.escape
global.eval                                 global.events                               global.fs                                   global.global
global.http                                 global.https                                global.isFinite                             global.isNaN
global.module                               global.net                                  global.os                                   global.parseFloat
global.parseInt                             global.path                                 global.process                              global.punycode
global.querystring                          global.readline                             global.repl                                 global.require
global.root                                 global.setImmediate                         global.setInterval                          global.setTimeout
global.stream                               global.string_decoder                       global.tls                                  global.tty
global.undefined                            global.unescape                             global.url                                  global.util
global.v8                                   global.vm                                   global.zlib                                 

> global.

Autocomplete - Double TAB

> var arr =[];
undefined
> arr.
arr.__defineGetter__      arr.__defineSetter__      arr.__lookupGetter__      arr.__lookupSetter__      arr.__proto__             arr.constructor           arr.hasOwnProperty
arr.isPrototypeOf         arr.propertyIsEnumerable  arr.toLocaleString        arr.toString              arr.valueOf               

arr.concat                arr.copyWithin            arr.entries               arr.every                 arr.fill                  arr.filter                arr.find
arr.findIndex             arr.forEach               arr.includes              arr.indexOf               arr.join                  arr.keys                  arr.lastIndexOf
arr.length                arr.map                   arr.pop                   arr.push                  arr.reduce                arr.reduceRight           arr.reverse
arr.shift                 arr.slice                 arr.some                  arr.sort                  arr.splice                arr.unshift               

> arr.

Autocomplete - Double TAB

> _
undefined
> Math.random()
0.34758947986306477
> _
0.34758947986306477
> let r = _
undefined
> r
0.34758947986306477
>

The last result - Underscore

> .
break   clear   editor  exit    help    load    save    

> .help
.break    Sometimes you get stuck, this gets you out
.clear    Alias for .break
.editor   Enter editor mode
.exit     Exit the repl
.help     Print this help message
.load     Load JS from a file into the REPL session
.save     Save all evaluated commands in this REPL session to a file

Special commands - Dot

const repl = require('repl');

repl.start({
    ignoreUndefined: true,
    replMode: repl.REPL_MODE_STRICT
});

Customize REPL

Customize REPL

Global Objects, Process and Buffer

Array                                Boolean                              Date                                 Error
EvalError                            Function                             Infinity                             JSON
Math                                 NaN                                  Number                               Object
RangeError                           ReferenceError                       RegExp                               String
SyntaxError                          TypeError                            URIError                             decodeURI
decodeURIComponent                   encodeURI                            encodeURIComponent                   eval
isFinite                             isNaN                                parseFloat                           parseInt
undefined

ArrayBuffer                          Buffer                               COUNTER_HTTP_CLIENT_REQUEST          COUNTER_HTTP_CLIENT_RESPONSE
COUNTER_HTTP_SERVER_REQUEST          COUNTER_HTTP_SERVER_RESPONSE         COUNTER_NET_SERVER_CONNECTION        COUNTER_NET_SERVER_CONNECTION_CLOSE
DTRACE_HTTP_CLIENT_REQUEST           DTRACE_HTTP_CLIENT_RESPONSE          DTRACE_HTTP_SERVER_REQUEST           DTRACE_HTTP_SERVER_RESPONSE
DTRACE_NET_SERVER_CONNECTION         DTRACE_NET_STREAM_END                DataView                             Float32Array
Float64Array                         GLOBAL                               Int16Array                           Int32Array
Int8Array                            Intl                                 Map                                  Promise
Proxy                                Reflect                              Set                                  Symbol
Uint16Array                          Uint32Array                          Uint8Array                           Uint8ClampedArray
WeakMap                              WeakSet                              _                                    assert
buffer                               child_process                        clearImmediate                       clearInterval
clearTimeout                         cluster                              console                              crypto
dgram                                dns                                  domain                               escape
events                               fs                                   global                               http
https                                module                               net                                  os
path                                 process                              punycode                             querystring
readline                             repl                                 require                              root
setImmediate                         setInterval                          setTimeout                           stream
string_decoder                       tls                                  tty                                  unescape
url                                  util                                 v8                                   vm
zlib

__defineGetter__                     __defineSetter__                     __lookupGetter__                     __lookupSetter__
__proto__                            constructor                          hasOwnProperty                       isPrototypeOf
propertyIsEnumerable                 toLocaleString                       toString                             valueOf
console.log(global);

{ DTRACE_NET_SERVER_CONNECTION: [Function],
  DTRACE_NET_STREAM_END: [Function],
  DTRACE_HTTP_SERVER_REQUEST: [Function],
  DTRACE_HTTP_SERVER_RESPONSE: [Function],
  DTRACE_HTTP_CLIENT_REQUEST: [Function],
  DTRACE_HTTP_CLIENT_RESPONSE: [Function],
  COUNTER_NET_SERVER_CONNECTION: [Function],
  COUNTER_NET_SERVER_CONNECTION_CLOSE: [Function],
  COUNTER_HTTP_SERVER_REQUEST: [Function],
  COUNTER_HTTP_SERVER_RESPONSE: [Function],
  COUNTER_HTTP_CLIENT_REQUEST: [Function],
  COUNTER_HTTP_CLIENT_RESPONSE: [Function],
  global: [Circular],
  process: 
   process {
     title: 'C:\\Program Files (x86)\\JetBrains\\WebStorm 2017.1\\bin\\runnerw.exe',
     version: 'v7.7.4',
     moduleLoadList: 
      [ 'Binding contextify',
        'Binding natives',
        'NativeModule events',
        'Binding config',
        'Binding icu',
        'NativeModule util',
        'Binding uv',
        'NativeModule buffer',
        'Binding buffer',
        'Binding util',
        'NativeModule internal/util',
        'NativeModule internal/buffer',
        'NativeModule timers',
        'Binding timer_wrap',
        'NativeModule internal/linkedlist',
        'NativeModule assert',
        'NativeModule internal/process',
        'NativeModule internal/process/warning',
        'NativeModule internal/process/next_tick',
        'NativeModule internal/process/promises',
        'NativeModule internal/process/stdio',
        'Binding constants',
        'NativeModule path',
        'NativeModule module',
        'NativeModule internal/module',
        'NativeModule vm',
        'NativeModule fs',
        'Binding fs',
        'NativeModule stream',
        'NativeModule internal/streams/legacy',
        'NativeModule _stream_readable',
        'NativeModule internal/streams/BufferList',
        'NativeModule _stream_writable',
        'NativeModule _stream_duplex',
        'NativeModule _stream_transform',
        'NativeModule _stream_passthrough',
        'Binding fs_event_wrap',
        'NativeModule internal/fs',
        'NativeModule internal/url',
        'NativeModule internal/querystring',
        'Binding url',
        'NativeModule querystring',
        'NativeModule os',
        'Binding os',
        'NativeModule console',
        'Binding tty_wrap',
        'NativeModule net',
        'NativeModule internal/net',
        'Binding cares_wrap',
        'Binding tcp_wrap',
        'Binding pipe_wrap',
        'Binding stream_wrap' ],
     versions: 
      { http_parser: '2.7.0',
        node: '7.7.4',
        v8: '5.5.372.42',
        uv: '1.11.0',
        zlib: '1.2.11',
        ares: '1.10.1-DEV',
        modules: '51',
        openssl: '1.0.2k',
        icu: '58.2',
        unicode: '9.0',
        cldr: '30.0.3',
        tz: '2016j' },
     arch: 'x64',
     platform: 'win32',
     release: 
      { name: 'node',
        sourceUrl: 'https://nodejs.org/download/release/v7.7.4/node-v7.7.4.tar.gz',
        headersUrl: 'https://nodejs.org/download/release/v7.7.4/node-v7.7.4-headers.tar.gz',
        libUrl: 'https://nodejs.org/download/release/v7.7.4/win-x64/node.lib' },
     argv: 
      [ 'C:\\Program Files\\nodejs\\node.exe',
        'D:\\projects\\nodejs-training\\module-1\\require\\index2.js' ],
     execArgv: [],
     env: 
      { ALLUSERSPROFILE: 'C:\\ProgramData',
        APPDATA: 'C:\\Users\\Shukhratbek_Mamadali\\AppData\\Roaming',
        CommonProgramFiles: 'C:\\Program Files\\Common Files',
        'CommonProgramFiles(x86)': 'C:\\Program Files (x86)\\Common Files',
        CommonProgramW6432: 'C:\\Program Files\\Common Files',
        COMPUTERNAME: 'EPBYGOMW0515',
        ComSpec: 'C:\\WINDOWS\\system32\\cmd.exe',
        DEBUG_COLORS: 'true',
        DEBUG_FD: '1',
        ELECTRON_NO_ATTACH_CONSOLE: 'true',
        FORCE_COLOR: 'true',
        FPS_BROWSER_APP_PROFILE_STRING: 'Internet Explorer',
        FPS_BROWSER_USER_PROFILE_STRING: 'Default',
        GIT_SSH: 'C:\\Program Files\\PuTTY\\plink.exe',
        GYP_MSVS_VERSION: '2015',
        HOMEDRIVE: 'C:',
        HOMEPATH: '\\Users\\Shukhratbek_Mamadali',
        LOCALAPPDATA: 'C:\\Users\\Shukhratbek_Mamadali\\AppData\\Local',
        LOGONSERVER: '\\\\EVBYGOMSA0003',
        MOCHA_COLORS: '1',
        NUMBER_OF_PROCESSORS: '4',
        OneDrive: 'C:\\Users\\Shukhratbek_Mamadali\\OneDrive',
        OS: 'Windows_NT',
        Path: 'C:\\Program Files\\Docker\\Docker\\Resources\\bin;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;C:\\Program Files\\Git\\cmd;C:\\Program Files\\PuTTY\\;C:\\Program Files\\nodejs\\;C:\\Program Files\\OpenVPN\\bin;C:\\HashiCorp\\Vagrant\\bin;C:\\Program Files (x86)\\Windows Kits\\8.1\\Windows Performance Toolkit\\;C:\\Ruby23-x64\\bin;C:\\Users\\Shukhratbek_Mamadali\\AppData\\Local\\Microsoft\\WindowsApps;C:\\Users\\Shukhratbek_Mamadali\\AppData\\Roaming\\npm',
        PATHEXT: '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.RB;.RBW',
        PROCESSOR_ARCHITECTURE: 'AMD64',
        PROCESSOR_IDENTIFIER: 'Intel64 Family 6 Model 78 Stepping 3, GenuineIntel',
        PROCESSOR_LEVEL: '6',
        PROCESSOR_REVISION: '4e03',
        ProgramData: 'C:\\ProgramData',
        ProgramFiles: 'C:\\Program Files',
        'ProgramFiles(x86)': 'C:\\Program Files (x86)',
        ProgramW6432: 'C:\\Program Files',
        PSModulePath: 'C:\\Program Files\\WindowsPowerShell\\Modules;C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\Modules',
        PUBLIC: 'C:\\Users\\Public',
        SESSIONNAME: 'Console',
        SSL_CERT_FILE: 'C:\\RailsInstaller\\cacert.pem',
        SYNDICATION_CONF: 'config/properties.json',
        SystemDrive: 'C:',
        SystemRoot: 'C:\\WINDOWS',
        TEMP: 'C:\\Users\\SHUKHR~1\\AppData\\Local\\Temp',
        TMP: 'C:\\Users\\SHUKHR~1\\AppData\\Local\\Temp',
        UATDATA: 'C:\\WINDOWS\\CCM\\UATData\\D9F8C395-CAB8-491d-B8AC-179A1FE1BE77',
        USERDNSDOMAIN: 'GOMEL.EPAM.COM',
        USERDOMAIN: 'GOMEL',
        USERDOMAIN_ROAMINGPROFILE: 'GOMEL',
        USERNAME: 'Shukhratbek_Mamadali',
        USERPROFILE: 'C:\\Users\\Shukhratbek_Mamadali',
        VBOX_MSI_INSTALL_PATH: 'C:\\Program Files\\Oracle\\VirtualBox\\',
        VS140COMNTOOLS: 'C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\Common7\\Tools\\',
        WEB_CONCURRENCY: 'cluster.js',
        windir: 'C:\\WINDOWS' },
     pid: 800,
     features: 
      { debug: false,
        uv: true,
        ipv6: true,
        tls_npn: true,
        tls_alpn: true,
        tls_sni: true,
        tls_ocsp: true,
        tls: true },
     _needImmediateCallback: false,
     execPath: 'C:\\Program Files\\nodejs\\node.exe',
     debugPort: 5858,
     _startProfilerIdleNotifier: [Function: _startProfilerIdleNotifier],
     _stopProfilerIdleNotifier: [Function: _stopProfilerIdleNotifier],
     _getActiveRequests: [Function: _getActiveRequests],
     _getActiveHandles: [Function: _getActiveHandles],
     reallyExit: [Function: reallyExit],
     abort: [Function: abort],
     chdir: [Function: chdir],
     cwd: [Function: cwd],
     umask: [Function: umask],
     _kill: [Function: _kill],
     _debugProcess: [Function: _debugProcess],
     _debugPause: [Function: _debugPause],
     _debugEnd: [Function: _debugEnd],
     hrtime: [Function: hrtime],
     cpuUsage: [Function: cpuUsage],
     dlopen: [Function: dlopen],
     uptime: [Function: uptime],
     memoryUsage: [Function: memoryUsage],
     binding: [Function: binding],
     _linkedBinding: [Function: _linkedBinding],
     _setupDomainUse: [Function: _setupDomainUse],
     _events: 
      { warning: [Function],
        newListener: [Function],
        removeListener: [Function] },
     _rawDebug: [Function],
     _eventsCount: 3,
     domain: null,
     _maxListeners: undefined,
     _fatalException: [Function],
     _exiting: false,
     assert: [Function],
     config: { target_defaults: [Object], variables: [Object] },
     emitWarning: [Function],
     nextTick: [Function: nextTick],
     _tickCallback: [Function: _tickCallback],
     _tickDomainCallback: [Function: _tickDomainCallback],
     stdout: [Getter],
     stderr: [Getter],
     stdin: [Getter],
     openStdin: [Function],
     exit: [Function],
     kill: [Function],
     argv0: 'C:\\Program Files\\nodejs\\node.exe',
     mainModule: 
      Module {
        id: '.',
        exports: {},
        parent: null,
        filename: 'D:\\projects\\nodejs-training\\module-1\\require\\index2.js',
        loaded: false,
        children: [],
        paths: [Object] } },
  Buffer: 
   { [Function: Buffer]
     poolSize: 8192,
     from: [Function],
     alloc: [Function],
     allocUnsafe: [Function],
     allocUnsafeSlow: [Function],
     isBuffer: [Function: isBuffer],
     compare: [Function: compare],
     isEncoding: [Function],
     concat: [Function],
     byteLength: [Function: byteLength] },
  clearImmediate: [Function],
  clearInterval: [Function],
  clearTimeout: [Function],
  setImmediate: [Function],
  setInterval: [Function],
  setTimeout: [Function],
  console: [Getter] }
process.versions
process.versions.v8
process.env
process.release.lts
process.stdin
process.stdout
 buffer
{ Buffer:
   { [Function: Buffer]
     poolSize: 8192,
     from: [Function],
     alloc: [Function],
     allocUnsafe: [Function],
     allocUnsafeSlow: [Function],
     isBuffer: [Function: isBuffer],
     compare: [Function: compare],
     isEncoding: [Function],
     concat: [Function],
     byteLength: [Function: byteLength] },
  SlowBuffer: [Function: SlowBuffer],
  INSPECT_MAX_BYTES: 50,
  kMaxLength: 2147483647,
  transcode: [Function: transcode] }

require()

require("module")

require("something")

console.log(module);

Module {
  id: '.',
  exports: {},
  parent: null,
  filename: 'D:\\projects\\nodejs-training\\module-1\\require\\index.js',
  loaded: false,
  children: [],
  paths: 
   [ 'D:\\projects\\nodejs-training\\module-1\\require\\node_modules',
     'D:\\projects\\nodejs-training\\module-1\\node_modules',
     'D:\\projects\\nodejs-training\\node_modules',
     'D:\\projects\\node_modules',
     'D:\\node_modules' ] }
require('find-me');

module.js:472
    throw err;
    ^

Error: Cannot find module 'find-me'
    at Function.Module._resolveFilename (module.js:470:15)
    at Function.Module._load (module.js:418:25)
    at Module.require (module.js:498:17)
    at require (internal/module.js:20:19)
    at Object.<anonymous> (D:\projects\nodejs-training\module-1\require\index.js:1:63)
    at Module._compile (module.js:571:32)
    at Object.Module._extensions..js (module.js:580:10)
    at Module.load (module.js:488:32)
    at tryModuleLoad (module.js:447:12)
    at Function.Module._load (module.js:439:3)
// $HOME/.node_modules
// $HOME/.node_libraries
// $PREFIX/lib/node
// index.js

console.log('In ./index.js');

require('find-me');
// ./node_modules/find-me.js

console.log('In ./node_modules/find-me.js');
// Terminal

In ./index.js
In ./node_modules/find-me.js
require.resolve('find-me');
loaded: false
m1 is not loaded yet { id: 'm1', content: [ 1 ] }
{ id: 'm2', content: [ 2, 22, 222 ] }
{ id: 'm1', content: [ 1, 11, 111 ] }
// m1.js

exports.id = 'm1';

exports.content = [1];
const m2 = require('./m2');
console.log(m2);

exports.content.push(11);
exports.content.push(111);
// m2.js

exports.id = 'm2';

exports.content = [2];
exports.content.push(22);
exports.content.push(222);

const m1 = require('./m1');
console.log('m1 is not loaded yet', m1);
// index.js

const m1 = require('./lib/m1');
console.log(m1);

Wrapping and Caching Modules

exports.id = 1; // this is ok

exports = {id: 1}; // this is not ok

module.exports = {id: 1}; // this is ok


var g = 42; // local to this file
node

require('module').wrapper
[ '(function (exports, require, module, __filename, __dirname) { ',
  '\n});' ]
console.log(arguments);
{ '0': {},
  '1': 
   { [Function: require]
     resolve: [Function: resolve],
     main: 
      Module {
        id: '.',
        exports: {},
        parent: null,
        filename: 'D:\\projects\\nodejs-training\\module-1\\wrapper.js',
        loaded: false,
        children: [],
        paths: [Object] },
     extensions: { '.js': [Function], '.json': [Function], '.node': [Function] },
     cache: { 'D:\projects\nodejs-training\module-1\wrapper.js': [Object] } },
  '2': 
   Module {
     id: '.',
     exports: {},
     parent: null,
     filename: 'D:\\projects\\nodejs-training\\module-1\\wrapper.js',
     loaded: false,
     children: [],
     paths: 
      [ 'D:\\projects\\nodejs-training\\module-1\\node_modules',
        'D:\\projects\\nodejs-training\\node_modules',
        'D:\\projects\\node_modules',
        'D:\\node_modules' ] },
  '3': 'D:\\projects\\nodejs-training\\module-1\\wrapper.js',
  '4': 'D:\\projects\\nodejs-training\\module-1' }
require = function() {
    return { mocked: true};
};

const fs = require('fs');
console.log(fs);

Override require

// printStars.js

const print = (stars, header) => {
    console.log('*'.repeat(stars));
    console.log(header);
    console.log('*'.repeat(stars));
};

if (require.main == module) {
    // Running as script

    print(process.argv[2], process.argv[3]);
} else {
    // Being required
    module.exports = print;
}
// index.js

const printStars = require('./printStars');
printStars(10, 'Hi!');
// index.js

require('./sample');
require('./sample');

Caching

// sample.js

console.log(`
    Sample
    File
`);
console.log(require.cache);

Caching


    Sample
    File

{ 'D:\projects\nodejs-training\module-1\wrapper\index.js': 
   Module {
     id: '.',
     exports: {},
     parent: null,
     filename: 'D:\\projects\\nodejs-training\\module-1\\wrapper\\index.js',
     loaded: false,
     children: [ [Object] ],
     paths: 
      [ 'D:\\projects\\nodejs-training\\module-1\\wrapper\\node_modules',
        'D:\\projects\\nodejs-training\\module-1\\node_modules',
        'D:\\projects\\nodejs-training\\node_modules',
        'D:\\projects\\node_modules',
        'D:\\node_modules' ] },
  'D:\projects\nodejs-training\module-1\wrapper\sample.js': 
   Module {
     id: 'D:\\projects\\nodejs-training\\module-1\\wrapper\\sample.js',
     exports: {},
     parent: 
      Module {
        id: '.',
        exports: {},
        parent: null,
        filename: 'D:\\projects\\nodejs-training\\module-1\\wrapper\\index.js',
        loaded: false,
        children: [Object],
        paths: [Object] },
     filename: 'D:\\projects\\nodejs-training\\module-1\\wrapper\\sample.js',
     loaded: true,
     children: [],
     paths: 
      [ 'D:\\projects\\nodejs-training\\module-1\\wrapper\\node_modules',
        'D:\\projects\\nodejs-training\\module-1\\node_modules',
        'D:\\projects\\nodejs-training\\node_modules',
        'D:\\projects\\node_modules',
        'D:\\node_modules' ] } }
delete require.cache['D:\projects\nodejs-training\module-1\wrapper\sampls.js'];

Delete Cache

// sample.js

module.exports = () => {
    console.log(`
        Sample
        File
    `);
};

Module multiple execute

// index.js

require('./sample')();
require('./sample')();

Hello World!

Made with Slides.com