NodeJS: Difference between revisions

No edit summary
 
(28 intermediate revisions by the same user not shown)
Line 1: Line 1:
Node.js is a JavaScript environment based on Chrome's V8 JavaScript engine.
Node.js is a JavaScript environment based on Chrome's V8 JavaScript engine.<br>
Node Package Manager (npm) is used to manage node packages installed on your computer or used in your node projects.<br>
Node Package Manager (npm) is used to manage node packages installed on your computer or used in your node projects.<br>
This page is primarilly on node-specific APIs and usage. See also [[JavaScript]] and [[TypeScript]].


=Installation=
==Installation==
==Windows==
===Linux===
Just download the latest LTS release from [https://nodejs.org/en/ the Node.js website]
Using the [https://github.com/nvm-sh/nvm Node Version Manager (nvm)] is recommended.<br>
 
This installs nvm in your home directory.
==Linux==
You should never use sudo when using nvm or npm.  
Using the [https://github.com/nvm-sh/nvm Node Version Manager (nvm)] is recommended. This does not require sudo as nvm is installed in your home directory.
Doing so could lead to permission issues.
You should never use sudo when using npm. Doing so could lead to permission issues.
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash
# Reload .bashrc
source ~/.bashrc
source ~/.bashrc
nvm install --lts node
nvm install --lts node
Line 17: Line 16:
</syntaxhighlight>
</syntaxhighlight>


=Usage=
===Windows===
You can [https://nodejs.org/en/ install node directly] or use [https://github.com/coreybutler/nvm-windows nvm-windows].<br>
Note that nvm-windows is not a port of nvm.
<syntaxhighlight lang="bash">
choco install nvm
nvm install lts
</syntaxhighlight>
 
==Usage==
JavaScript files can be run directly using <code>node index.js</code>
JavaScript files can be run directly using <code>node index.js</code>
==Filesystem Access==
===Filesystem Access===
Install [https://www.npmjs.com/package/fs-extra fs-extra] to your project.
Install [https://www.npmjs.com/package/fs-extra fs-extra] to your project.
<syntaxhighlight lang="js">
<syntaxhighlight lang="js">
Line 27: Line 34:
// Synchronous functions
// Synchronous functions


// Only in fs-extra
//// Only in fs-extra
 
// Remove file or folder (rm -rf)
// Remove file or folder (rm -rf)
// Does nothing if path doesn't exist
// Does nothing if path doesn't exist
Line 37: Line 43:
fs.ensureDirSync('/tmp/folder1/folder2');
fs.ensureDirSync('/tmp/folder1/folder2');


 
//// Available in node's native 'fs'
// Available in node's native 'fs'
 
// List all files and folders in a directory
// List all files and folders in a directory
fs.readdirSync('/tmp');
fs.readdirSync('/tmp');
Line 55: Line 59:
</syntaxhighlight>
</syntaxhighlight>


==Logging==
====Paths====
* <code>path.extname</code>
 
===Writing to a file===
[https://nodejs.org/api/fs.html Reference]<br>
<syntaxhighlight lang="javascript">
const fs = require('fs-extra');
 
let pw = 'My_password_is_kkk';
 
fs.writeFileSync('pw.txt', pw);
</syntaxhighlight>
 
===Logging===
Mostly the same as web JavaScript.<br>
Mostly the same as web JavaScript.<br>
[https://nodejs.org/api/console.html Reference]
[https://nodejs.org/api/console.html Reference]
<syntaxhighlight>
<syntaxhighlight lang="js">
console.log("a", "b");
console.log("a", "b");


Line 64: Line 81:
</syntaxhighlight>
</syntaxhighlight>


==CSV==
===CSV===
Install csv from npm.<br>
Install csv from npm.<br>
[https://csv.js.org/parse/api/ Reference]
[https://csv.js.org/parse/api/ Reference]
<syntaxhighlight>
<syntaxhighlight lang="js">
</syntaxhighlight>
 
===Running other processes===
You can invoke other processes or CLI programs using <code>spawn</code> or <code>spawnSync</code>
<syntaxhighlight lang="javascript">
const {spawn, spawnSync} = require('child_process');
</syntaxhighlight>
</syntaxhighlight>


=Package Management=
Example:
<syntaxhighlight lang="javascript">
spawnSync("ffmpeg", flatten([
  "-i", file,
  "-c:v libx265 -crf 28 -preset medium -c:a libopus -b:a 128K".split(" "),
  "-y", output_path
]), {
  cwd: process.cwd(),
  env: process.env,
  stdio: [process.stdin, process.stdout, process.stderr],
  encoding: 'utf-8'
});
</syntaxhighlight>
 
==Debugging==
===Inspector===
* Add the <code>--inspect</code> flag to your node call (before the name of the script).
* Then go to <code>chrome://inspect</code>
 
==Package Management==
===NPM===
===NPM===
To add node packages to an new project. Use <code>npm init</code><br>
To add node packages to an new project. Use <code>npm init</code><br>
Line 83: Line 125:
pnpm uses its own lockfile instead of packages-lock.json.
pnpm uses its own lockfile instead of packages-lock.json.


=Useful Packages=
===Publishing===
See [[Npm (software)#Publishing]].
 
==Useful Packages==
===fs-extra===
===fs-extra===
[https://www.npmjs.com/package/fs-extra fs-extra] adds additional commands for accessing the filesystem such as copying and moving files.
[https://www.npmjs.com/package/fs-extra fs-extra] adds additional commands for accessing the filesystem such as copying and moving files.
===node-fetch===
[https://www.npmjs.com/package/node-fetch node-fetch]<br>
===file-type===
[https://www.npmjs.com/package/file-type file-type]<br>
[https://www.npmjs.com/package/file-type-cli file-type-cli]<br>
Detects the file type of a file or buffer
===argparse===
[https://www.npmjs.com/package/argparse argparse]
This is a port of python's argparse. However, it does not support configuration files.
{{hidden | Example |
<syntaxhighlight lang="python">
const parser = new ArgumentParser({
  version: "0.0.1",
  addHelp: true,
  description: "Description here"
});
// Add your arguments here
parser.addArgument(["--config"], {
  type: String,
  help: "Path to config file (optional)"
});
const args = (function() {
  let myArgs = parser.parseArgs();
  if (myArgs.config && myArgs.config.length > 0) {
    const filedata = fs.readFileSync(myArgs.config, "utf8");
    const myArgsArr = filedata
      .split("\n")
      .filter(x => x.length > 0)
      .map(x => "--" + x)
      .map(x => x.split("="))
      .flatten();
    myArgs = parser.parseArgs(myArgsArr);
  }
  return myArgs;
})();
</syntaxhighlight>
}}
===node-worker-threads-pool===
[https://www.npmjs.com/package/node-worker-threads-pool Link] 
A cool thread pool implementation.