Vytvoření vaší první Node.js aplikace příkazového řádku

Nástroje příkazového řádku jsou nutností pro každého zkušeného webového vývojáře. Node.js velmi usnadňuje vývoj takových nástrojů díky velkému množství modulů s otevřeným zdrojovým kódem a skvělému správci balíčků.

V tomto tutoriálu převedeme náš Cute File Browser, který jsme zveřejnili minulý týden, z PHP na Node. Naším cílem je vytvořit nástroj příkazového řádku, který mohou uživatelé spustit na svém počítači a zpřístupnit libovolnou složku v místní síti. To lze použít v domácím nebo kancelářském prostředí k rychlému sdílení složky se soubory všem ve stejné síti.

Rychlý start

Zdrojový kód je dostupný na github a npm. Pokud se nechcete řídit tímto návodem a chcete si s ním pouze hrát, můžete jej nainstalovat přímo pomocí tohoto příkazu:

npm install -g cute-files

Poté přejděte do složky, kterou chcete sdílet ve svém terminálu, a spusťte příkaz, který jste právě nainstalovali:

cute-files

Nyní bude tato složka k dispozici na <yourip>:3000 a budou přístupné komukoli ve vaší síti LAN.

Pojďme to postavit krok za krokem

Nástroje příkazového řádku jsou jen běžné programy uzlů. Jsou k dispozici globálně a lze je volat z libovolné složky. Kroky pro vytvoření naší aplikace příkazového řádku jsou tedy téměř totožné s jakýmkoli jiným projektem založeným na uzlech, který jste mohli vyvíjet dříve. Vytvořte novou složku pro svůj projekt a přejděte do ní ve svém terminálu. Budeme ji označovat jako složku projektu .

Nastavení souboru package.json

Za předpokladu, že jste již nainstalovali uzel, musíme nejprve vytvořit package.json soubor. S tím vám může pomoci utilita npm. Spusťte tento příkaz ve složce projektu:

npm init

Budete požádáni o informace o vašem projektu. Pokud si nejste jisti, co napsat, stiskněte return pro výchozí hodnoty. Vyplňte cute-files.js jako vstupní bod. Toto bude hlavní soubor, který bude volán uzlem. Soubor package.json ještě není kompletní – chceme náš skript zpřístupnit globálně, takže musíme přidat další pole – bin (viz příklad můj package.json). To říká npm, aby tyto skripty zpřístupnil jako spustitelné soubory.

Instalace některých balíčků

Nyní budete muset nainstalovat některé knihovny, které potřebujeme pro prohlížeč souborů. --save flag je automaticky přidá do vašeho package.json:

npm install commander content-disposition express --save

K čemu je použijeme:

  • commander bude analyzovat argumenty příkazového řádku. Budeme podporovat pouze jeden – pro port , ale protože je analýza atributů základní součástí psaní aplikací příkazového řádku, je dobré vědět, jak tuto knihovnu používat.
  • content-disposition nám sdělí správná záhlaví příloh pro každý soubor. Tyto hlavičky jsou potřeba k vynucení stahování souborů (jinak by je prohlížeč jen otevřel).
  • express obslouží soubory a zpracuje /scan route, která posílá JSON všech souborů a adresářů do frontendu.

Modul pro skenování souborů

Abychom mohli nabídnout okamžité vyhledávání a procházení, naše aplikace odešle JSON se všemi soubory a složkami do frontendu při načtení. V původním tutoriálu jsme to udělali s PHP, ale teď to uděláme s Node. Vytvořte nový soubor ve složce projektu – scan.js - a vložte následující kód:

var fs = require('fs'),
    path = require('path');

module.exports = function scan(dir, alias){

    return {
        name: alias,
        type: 'folder',
        path: alias,
        items: walk(dir, alias)
    };

};

function walk(dir, prefix){

    prefix = prefix || '';

    if(!fs.existsSync(dir)){
        return [];
    }

    return fs.readdirSync(dir).filter(function(f){

        return f && f[0] != '.'; // Ignore hidden files

    }).map(function(f){

        var p = path.join(dir, f),
            stat = fs.statSync(p);

        if(stat.isDirectory()){

            return {
                name: f,
                type: 'folder',
                path: path.join(prefix, p),
                items: walk(p, prefix)
            };

        }

        return {
            name: f,
            type: 'file',
            path: path.join(prefix, p),
            size: stat.size
        }

    });

};

Tento kód používá modul fs uzlu a rekurzivně prochází všechny soubory a složky v adresáři. Exportuje skenování funkce, která se volá s cestou a aliasem. Cesta je složka, která má být zkontrolována, a alias je název, pod kterým bude prezentována v rozhraní (nechceme zobrazovat skutečný název adresáře, který je obsluhován). V našem příkladu jej nahradíme „soubory“.

Hlavní modul

Hlavním souborem naší aplikace je cute-files.js . Vytvořte soubor a vložte následující kód:

#!/usr/bin/env node

var path = require('path');
var express = require('express');
var contentDisposition = require('content-disposition');
var pkg = require( path.join(__dirname, 'package.json') );

var scan = require('./scan');

// Parse command line options

var program = require('commander');

program
    .version(pkg.version)
    .option('-p, --port <port>', 'Port on which to listen to (defaults to 3000)', parseInt)
    .parse(process.argv);

var port = program.port || 3000;

// Scan the directory in which the script was called. It will
// add the 'files/' prefix to all files and folders, so that
// download links point to our /files route

var tree = scan('.', 'files');

// Ceate a new express app

var app = express();

// Serve static files from the frontend folder

app.use('/', express.static(path.join(__dirname, 'frontend')));

// Serve files from the current directory under the /files route

app.use('/files', express.static(process.cwd(), {
    index: false,
    setHeaders: function(res, path){

        // Set header to force files to download

        res.setHeader('Content-Disposition', contentDisposition(path))

    }
}));

// This endpoint is requested by our frontend JS

app.get('/scan', function(req,res){
    res.send(tree);
});

// Everything is setup. Listen on the port.

app.listen(port);

console.log('Cute files is running on port ' + port);

První řádek je důležitý. Ačkoli to není platný JS, používá se na *nix systémech, aby umožnil spouštění skriptů jako programů, což je přesně to, co potřebujeme, abychom vytvořili roztomilé soubory příkaz dostupný kdekoli.

Tento skript používá expres a další moduly, které jsme nainstalovali dříve, a náš modul scan.js. Vše, co zbývá, je zkopírovat frontend z původního tutoriálu.

Rozhraní

Nick už udělal většinu práce v tutoriálu z minulého týdne. Náš skript scan.js vrací stejný výstup jako scan.php, takže nejsou nutné žádné úpravy frontendu. Potřebujeme zkopírovat pouze index.html a majetek složky z poslední doby do nové složky - frontend , která bude obsluhována expresem. Jak by měly vaše adresáře vypadat, můžete vidět z repozitáře.

Propojení modulu

Váš nový modul je připraven! Mělo by to fungovat, když spustíte node cute-files.js ve složce projektu. Ale to není příliš užitečné, protože to bude sloužit pouze složce projektu - chceme mít možnost volat cute-files z libovolného adresáře, ale není dostupný, pokud modul nenainstalujete globálně. npm má užitečný příkaz, který nám pomůže. Spusťte to ve svém terminálu ze složky projektu:

npm link

Tím se modul zpřístupní globálně, takže nyní můžete používat roztomilé soubory příkaz kdekoli!

Publikování na npm

Kde je zábava psát modul a nesdílet jej s přáteli? Publikovat váš nový modul na npm je přímočaré (nedoporučuji to však dělat pro tento konkrétní modul – bude to pouze duplikát roztomilých souborů):

  1. Vytvořte si účet na webu npm
  2. Přihlaste se z nástroje příkazového řádku npm pomocí npm login příkaz
  3. Vyberte pro svůj modul jedinečný název a aktualizujte soubor package.json
  4. dd do složky projektu a spusťte npm publish .

Pokud vše proběhlo bez problémů, za pár sekund uvidíte svůj modul na webu npm a každý si ho bude moci nainstalovat.

Dobrá práce! Právě jste vytvořili svou první aplikaci příkazového řádku s node!