• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • node.js基礎

    標簽: JavaScript

    特點

    簡單的說 Node.js 就是運行在服務端的 JavaScript。

    Node.js 是單進程單線程應用程序,基于Google的V8引擎提供的異步執行回調接口,通過這些接口可以處理大量的并發,所以性能非常高。

    Node.js 幾乎每一個 API 都是支持回調函數的。

    Node.js 基本上所有的事件機制都是用設計模式中觀察者模式實現。

    第一個Node.js程序:Hello World!

    console.log("Hello World");
    
    node helloworld.js
    

    NPM包管理工具

    使用 npm 命令安裝模塊
    npm 安裝 Node.js 模塊語法格式如下:

    $ npm install <Module Name>
    

    以下實例,我們使用 npm 命令安裝常用的 Node.js web框架模塊 express:

    var express = require(‘express’);
    全局安裝與本地安裝
    npm 的包安裝分為本地安裝(local)、全局安裝(global)兩種,從敲的命令行來看,差別只是有沒有-g而已,比如

    npm install express          # 本地安裝
    npm install express -g   # 全局安裝
    

    本地安裝

    1. 將安裝包放在 ./node_modules 下(運行 npm 命令時所在的目錄),如果沒有 node_modules 目錄,會在當前執行 npm 命令的目錄下生成 node_modules 目錄。
    2. 可以通過 require() 來引入本地安裝的包。

    全局安裝

    1. 將安裝包放在 /usr/local 下或者你 node 的安裝目錄。
    2. 可以直接在命令行里使用

    回調函數

    Node.js 異步編程的直接體現就是回調。
    例如,我們可以一邊讀取文件,一邊執行其他命令,在文件讀取完成后,我們將文件內容作為回調函數的參數返回。這樣在執行代碼時就沒有阻塞或等待文件 I/O 操作。這就大大提高了 Node.js 的性能,可以處理大量的并發請求。

    創建 main.js 文件, 代碼如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
        if (err) return console.error(err);
        console.log(data.toString());
    });
    
    console.log("程序執行結束!");
    

    以上代碼執行結果如下:

    $ node main.js
    程序執行結束!
    helloworld官網地址:www.runoob.com
    

    事件循環

    Node.js 單線程類似進入一個while(true)的事件循環,直到沒有事件觀察者退出,每個異步事件都生成一個事件觀察者,如果有事件發生就調用該回調函數.

    Node.js 所有的異步 I/O 操作在完成時都會發送一個事件到事件隊列

    Node.js 里面的許多對象都會分發事件:一個 net.Server 對象會在每次有新連接時觸發一個事件, 一個 fs.readStream 對象會在文件被打開的時候觸發一個事件。 所有這些產生事件的對象都是 events.EventEmitter 的實例。

    EventEmitter 類
    events 模塊只提供了一個對象: events.EventEmitter。EventEmitter 的核心就是事件觸發與事件監聽器功能的封裝。

    可以參考Node.js EventEmitter教程
    你可以通過require(“events”);來訪問該模塊。
    創建 main.js 文件,代碼如下所示:

    實例

    // 引入 events 模塊
    var events = require('events');
    // 創建 eventEmitter 對象
    var eventEmitter = new events.EventEmitter();
     
    // 創建事件處理程序
    var connectHandler = function connected() {
       console.log('連接成功。');
      
       // 觸發 data_received 事件 
       eventEmitter.emit('data_received');
    }
     
    // 綁定 connection 事件處理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函數綁定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('數據接收成功。');
    });
     
    // 觸發 connection 事件 
    eventEmitter.emit('connection');
     
    console.log("程序執行完畢。");
    

    接下來讓我們執行以上代碼:

    $ node main.js
    連接成功。
    數據接收成功。
    程序執行完畢。
    

    模塊系統

    為了讓Node.js的文件可以相互調用,Node.js提供了一個簡單的模塊系統。

    模塊是Node.js 應用程序的基本組成部分,文件和模塊是一一對應的。換言之,一個 Node.js 文件就是一個模塊,這個文件可能是JavaScript 代碼、JSON 或者編譯過的C/C++ 擴展。

    Node.js 提供了 exports 和 require 兩個對象,其中 exports 是模塊公開的接口,require 用于從外部獲取一個模塊的接口,即所獲取模塊的 exports 對象。

    接下來我們就來創建 hello.js 文件,代碼如下:

    exports.world = function() {
      console.log('Hello World');
    }
    

    在以上示例中,hello.js 通過 exports 對象把 world 作為模塊的訪問接口,在 main.js 中通過 require(’./hello’) 加載這個模塊,然后就可以直接訪 問 hello.js 中 exports 對象的成員函數了。

    代碼 require(’./hello’) 引入了當前目錄下的 hello.js 文件(./ 為當前目錄,node.js 默認后綴為 js)
    有時候我們只是想把一個對象封裝到模塊中,格式如下:

    module.exports = function() {
      // ...
    }
    

    例如:

    //hello.js 
    function Hello() { 
        var name; 
        this.setName = function(thyName) { 
            name = thyName; 
        }; 
        this.sayHello = function() { 
            console.log('Hello ' + name); 
        }; 
    }; 
    module.exports = Hello;
    

    這樣就可以直接獲得這個對象了:

    //main.js 
    var Hello = require('./hello'); 
    hello = new Hello(); 
    hello.setName('BYVoid'); 
    hello.sayHello();
    

    模塊接口的唯一變化是使用 module.exports = Hello 代替了exports.world = function(){}。 在外部引用該模塊時,其接口對象就是要輸出的 Hello 對象本身,而不是原先的 exports。

    不建議同時使用 exports 和 module.exports。

    如果先使用 exports 對外暴露屬性或方法,再使用 module.exports 暴露對象,會使得 exports 上暴露的屬性或者方法失效。

    原因在于,exports 僅僅是 module.exports 的一個引用。在 nodejs 中,是這么設計 require 函數的:

    function require(...){
      var module = {exports: {}};
    
      ((module, exports) => {
        function myfn () {}
        // 這個myfn就是我們自己的代碼
        exports.myfn = myfn; // 這里是在原本的對象上添加了一個myfn方法。
        module.exports = myfn;// 這個直接把當初的對象進行覆蓋。
      })(module,module.exports)
      return module.exports;
    }
    

    由于 Node.js 中存在 4 類模塊(原生模塊和3種文件模塊),盡管 require 方法極其簡單,但是內部的加載卻是十分復雜的,其加載優先級也各自不同。

    模塊加載流程圖:
    image

    1. 從文件模塊緩存中加載
      盡管原生模塊與文件模塊的優先級不同,但是都會優先從文件模塊的緩存中加載已經存在的模塊。

    2. 從原生模塊加載
      原生模塊的優先級僅次于文件模塊緩存的優先級。require 方法在解析文件名之后,優先檢查模塊是否在原生模塊列表中。以http模塊為例,盡管在目錄下存在一個 http/http.js/http.node/http.json 文件,require(“http”) 都不會從這些文件中加載,而是從原生模塊中加載。

    原生模塊也有一個緩存區,同樣也是優先從緩存區加載。如果緩存區沒有被加載過,則調用原生模塊的加載方式進行加載和執行。

    1. 從文件加載
      當文件模塊緩存中不存在,而且不是原生模塊的時候,Node.js 會解析 require 方法傳入的參數,并從文件系統中加載實際的文件,加載過程中的包裝和編譯細節在前一節中已經介紹過,這里我們將詳細描述查找文件模塊的過程,其中,也有一些細節值得知曉。

    require方法接受以下幾種參數的傳遞:

    • http、fs、path等,原生模塊。
    • ./mod或…/mod,相對路徑的文件模塊。
    • /pathtomodule/mod,絕對路徑的文件模塊。
    • mod,非原生模塊的文件模塊。

    函數

    在JavaScript中,一個函數可以作為另一個函數的參數。我們可以先定義一個函數,然后傳遞,也可以在傳遞參數的地方直接定義函數。

    Node.js中函數的使用與Javascript類似,舉例來說,你可以這樣做:

    function say(word) {
      console.log(word);
    }
    
    function execute(someFunction, value) {
      someFunction(value);
    }
    
    execute(say, "Hello");
    

    匿名函數

    我們可以把一個函數作為變量傳遞。但是我們不一定要繞這個"先定義,再傳遞"的圈子,我們可以直接在另一個函數的括號中定義和傳遞這個函數:

    
    
    function execute(someFunction, value) {
      someFunction(value);
    }
    
    execute(function(word){ console.log(word) }, "Hello");
    

    Node.js 路由

    我們要為路由提供請求的 URL 和其他需要的 GET 及 POST 參數,隨后路由需要根據這些數據來執行相應的代碼。

    我們需要的所有數據都會包含在 request 對象中,該對象作為 onRequest() 回調函數的第一個參數傳遞。但是為了解析這些參數數據,我們需要額外的 Node.JS 模塊,它們分別是 url 和 querystring 模塊
    當然我們也可以用 querystring 模塊來解析 POST 請求體中的參數,稍后會有演示。
    image

    Node.js 常用工具

    util 是一個Node.js 核心模塊,提供常用函數的集合,用于彌補核心 JavaScript 的功能 過于精簡的不足。

    const util = require('util');
    

    util.callbackify(original) 將 async 異步函數(或者一個返回值為 Promise 的函數)轉換成遵循異常優先的回調風格的函數,例如將 (err, value) => … 回調作為最后一個參數。 在回調函數中,第一個參數為拒絕的原因(如果 Promise 解決,則為 null),第二個參數則是解決的值。

    const util = require('util');
    
    async function fn() {
      return 'hello world';
    }
    const callbackFunction = util.callbackify(fn);
    
    callbackFunction((err, ret) => {
      if (err) throw err;
      console.log(ret);
    });
    

    util.inspect(object,[showHidden],[depth],[colors]) 是一個將任意對象轉換 為字符串的方法

    util.isArray(object)
    如果給定的參數 “object” 是一個數組返回 true,否則返回 false。

    util.isRegExp(object)
    如果給定的參數 “object” 是一個正則表達式返回true,否則返回false。

    util.isDate(object)
    如果給定的參數 “object” 是一個日期返回true,否則返回false。

    Node.js GET/POST請求

    獲取GET請求內容
    由于GET請求直接被嵌入在路徑中,URL是完整的請求路徑,包括了?后面的部分,因此你可以手動解析后面的內容作為GET請求的參數。

    node.js 中 url 模塊中的 parse 函數提供了這個功能。

    獲取 URL 的參數

    我們可以使用 url.parse 方法來解析 URL 中的參數,代碼如下:

    var http = require('http');
    var url = require('url');
    var util = require('util');
     
    http.createServer(function(req, res){
        res.writeHead(200, {'Content-Type': 'text/plain'});
     
        // 解析 url 參數
        var params = url.parse(req.url, true).query;
        res.write("網站名:" + params.name);
        res.write("\n");
        res.write("網站 URL:" + params.url);
        res.end();
     
    }).listen(3000);
    

    在瀏覽器中訪問 http://localhost:3000/user?name=helloworld&url=www.runoob.com 然后查看返回結果:

    獲取 POST 請求內容

    POST 請求的內容全部的都在請求體中,http.ServerRequest 并沒有一個屬性內容為請求體,原因是等待請求體傳輸可能是一件耗時的工作。

    比如上傳文件,而很多時候我們可能并不需要理會請求體的內容,惡意的POST請求會大大消耗服務器的資源,所以 node.js 默認是不會解析請求體的,當你需要的時候,需要手動來做。

    Express 框架

    Express 簡介

    Express 是一個簡潔而靈活的 node.js Web應用框架, 提供了一系列強大特性幫助你創建各種 Web 應用,和豐富的 HTTP 工具。

    使用 Express 可以快速地搭建一個完整功能的網站。

    Express 框架核心特性:

    • 可以設置中間件來響應 HTTP 請求。
    • 定義了路由表用于執行不同的 HTTP 請求動作。
    • 可以通過向模板傳遞參數來動態渲染 HTML 頁面。

    express安裝方式

    路由

    我們已經了解了 HTTP 請求的基本應用,而路由決定了由誰(指定腳本)去響應客戶端請求。

    在HTTP請求中,我們可以通過路由提取出請求的URL以及GET/POST參數。

    接下來我們擴展 Hello World,添加一些功能來處理更多類型的 HTTP 請求。

    var express = require('express');
    var app = express();
     
    //  主頁輸出 "Hello World"
    app.get('/', function (req, res) {
       console.log("主頁 GET 請求");
       res.send('Hello GET');
    })
     
     
    //  POST 請求
    app.post('/', function (req, res) {
       console.log("主頁 POST 請求");
       res.send('Hello POST');
    })
     
    //  /del_user 頁面響應
    app.get('/del_user', function (req, res) {
       console.log("/del_user 響應 DELETE 請求");
       res.send('刪除頁面');
    })
     
    //  /list_user 頁面 GET 請求
    app.get('/list_user', function (req, res) {
       console.log("/list_user GET 請求");
       res.send('用戶列表頁面');
    })
     
    // 對頁面 abcd, abxcd, ab123cd, 等響應 GET 請求
    app.get('/ab*cd', function(req, res) {   
       console.log("/ab*cd GET 請求");
       res.send('正則匹配');
    })
     
     
    var server = app.listen(8081, function () {
     
      var host = server.address().address
      var port = server.address().port
     
      console.log("應用實例,訪問地址為 http://%s:%s", host, port)
     
    })
    

    執行以上代碼:

    $ node express_demo2.js 
    應用實例,訪問地址為 http://0.0.0.0:8081
    

    接下來你可以嘗試訪問 http://127.0.0.1:8081 不同的地址,查看效果。

    比如 在瀏覽器中訪問 http://127.0.0.1:8081/list_user

    詳細內容請到express

    連接 MongoDB

    MongoDB是一種文檔導向數據庫管理系統,由C++撰寫而成。

    本章節我們將為大家介紹如何使用 Node.js 來連接 MongoDB,并對數據庫進行操作。
    安裝驅動
    使用了淘寶定制的 cnpm 命令進行安裝

    $ cnpm install mongodb
    

    接下來我們來實現增刪改查功能。

    創建數據庫
    要在 MongoDB 中創建一個數據庫,首先我們需要創建一個 MongoClient 對象,然后配置好指定的 URL 和 端口號。

    如果數據庫不存在,MongoDB 將創建數據庫并建立連接。

    創建連接

    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/runoob";
     
    MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
      if (err) throw err;
      console.log("數據庫已創建!");
      db.close();
    });
    

    創建集合(即表)
    我們可以使用 createCollection() 方法來創建集合:

    創建集合

    var MongoClient = require('mongodb').MongoClient;
    var url = 'mongodb://localhost:27017/runoob';
    MongoClient.connect(url, { useNewUrlParser: true }, function (err, db) {
        if (err) throw err;
        console.log('數據庫已創建');
        var dbase = db.db("runoob");
        dbase.createCollection('site', function (err, res) {
            if (err) throw err;
            console.log("創建集合!");
            db.close();
        });
    });
    

    數據庫操作( CURD )
    與 MySQL 不同的是 MongoDB 會自動創建數據庫和集合,所以使用前我們不需要手動去創建。

    插入數據

    以下實例我們連接數據庫 runoob 的 site 表,并插入一條數據條數據,使用 insertOne()

    插入一條數據

    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";
     
    MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
        if (err) throw err;
        var dbo = db.db("runoob");
        var myobj = { name: "helloworld", url: "www.runoob" };
        dbo.collection("site").insertOne(myobj, function(err, res) {
            if (err) throw err;
            console.log("文檔插入成功");
            db.close();
        });
    });
    

    執行以下命令輸出就結果為:

    $ node test.js
    文檔插入成功
    

    從輸出結果來看,數據已插入成功。

    我們也可以打開 MongoDB 的客戶端查看數據,如:

    show dbs
    runoob 0.000GB # 自動創建了 runoob 數據庫
    show tables
    site # 自動創建了 site 集合(數據表)
    db.site.find()
    { “_id” : ObjectId(“5a794e36763eb821b24db854”), “name” : “helloworld”, “url” : “www.runoob” }

    如果要插入多條數據可以使用 insertMany():

    插入多條數據

    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";
     
    MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
        if (err) throw err;
        var dbo = db.db("runoob");
        var myobj =  [
            { name: '菜鳥工具', url: 'https://c.runoob.com', type: 'cn'},
            { name: 'Google', url: 'https://www.google.com', type: 'en'},
            { name: 'Facebook', url: 'https://www.google.com', type: 'en'}
           ];
        dbo.collection("site").insertMany(myobj, function(err, res) {
            if (err) throw err;
            console.log("插入的文檔數量為: " + res.insertedCount);
            db.close();
        });
    });
    

    res.insertedCount 為插入的條數。

    查詢數據
    可以使用 find() 來查找數據, find() 可以返回匹配條件的所有數據。 如果未指定條件,find() 返回集合中的所有數據。

    find()
    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";
     
    MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
        if (err) throw err;
        var dbo = db.db("runoob");
        dbo.collection("site"). find({}).toArray(function(err, result) { // 返回集合中所有數據
            if (err) throw err;
            console.log(result);
            db.close();
        });
    });
    

    以下實例檢索 name 為 “helloworld” 的實例:

    查詢指定條件的數據

    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";
     
    MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
        if (err) throw err;
        var dbo = db.db("runoob");
         var whereStr = {"name":'helloworld'};  // 查詢條件
        dbo.collection("site").find(whereStr).toArray(function(err, result) {
            if (err) throw err;
            console.log(result);
            db.close();
        });
    });
    

    執行以下命令輸出就結果為:

    [ { _id: 5a794e36763eb821b24db854,
        name: 'helloworld',
        url: 'www.runoob' } ]
    

    更新數據

    我們也可以對數據庫的數據進行修改,以下實例將 name 為 “helloworld” 的 url 改為 https://www.runoob.com:

    更新一條數據

    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";
     
    MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
        if (err) throw err;
        var dbo = db.db("runoob");
        var whereStr = {"name":'helloworld'};  // 查詢條件
        var updateStr = {$set: { "url" : "https://www.runoob.com" }};
        dbo.collection("site").updateOne(whereStr, updateStr, function(err, res) {
            if (err) throw err;
            console.log("文檔更新成功");
            db.close();
        });
    });
    

    執行成功后,進入 mongo 管理工具查看數據已修改:

    db.site.find().pretty()
    {
    “_id” : ObjectId(“5a794e36763eb821b24db854”),
    “name” : “helloworld”,
    “url” : “https://www.runoob.com” // 已修改為 https
    }
    如果要更新所有符合條的文檔數據可以使用 updateMany():

    更新多條數據

    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";
     
    MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
        if (err) throw err;
        var dbo = db.db("runoob");
        var whereStr = {"type":'en'};  // 查詢條件
        var updateStr = {$set: { "url" : "https://www.runoob.com" }};
        dbo.collection("site").updateMany(whereStr, updateStr, function(err, res) {
            if (err) throw err;
             console.log(res.result.nModified + " 條文檔被更新");
            db.close();
        });
    });
    

    result.nModified 為更新的條數。

    刪除數據

    以下實例將 name 為 “helloworld” 的數據刪除 :

    刪除一條數據

    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";
     
    MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
        if (err) throw err;
        var dbo = db.db("runoob");
        var whereStr = {"name":'helloworld'};  // 查詢條件
        dbo.collection("site").deleteOne(whereStr, function(err, obj) {
            if (err) throw err;
            console.log("文檔刪除成功");
            db.close();
        });
    });
    

    執行成功后,進入 mongo 管理工具查看數據已刪除:

    db.site.find()

    如果要刪除多條語句可以使用 deleteMany() 方法

    以下實例將 type 為 en 的所有數據刪除 :

    刪除多條數據

    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";
     
    MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
        if (err) throw err;
        var dbo = db.db("runoob");
        var whereStr = { type: "en" };  // 查詢條件
        dbo.collection("site").deleteMany(whereStr, function(err, obj) {
            if (err) throw err;
            console.log(obj.result.n + " 條文檔被刪除");
            db.close();
        });
    });
    

    obj.result.n 刪除的條數。

    排序

    排序 使用 sort() 方法,該方法接受一個參數,規定是升序(1)還是降序(-1)。

    例如:

    { type: 1 } // 按 type 字段升序
    { type: -1 } // 按 type 字段降序
    按 type 升序排列:

    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";
     
    MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
        if (err) throw err;
        var dbo = db.db("runoob");
        var mysort = { type: 1 };
        dbo.collection("site").find().sort(mysort).toArray(function(err, result) {
            if (err) throw err;
            console.log(result);
            db.close();
        });
    });
    

    查詢分頁

    如果要設置指定的返回條數可以使用 limit() 方法,該方法只接受一個參數,指定了返回的條數。

    limit():讀取兩條數據

    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";
     
    MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
        if (err) throw err;
        var dbo = db.db("runoob");
        dbo.collection("site").find().limit(2).toArray(function(err, result) {
            if (err) throw err;
            console.log(result);
            db.close();
      });
    });
    

    如果要指定跳過的條數,可以使用 skip() 方法。

    skip(): 跳過前面兩條數據,讀取兩條數據

    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";
     
    MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
        if (err) throw err;
        var dbo = db.db("runoob");
        dbo.collection("site").find().skip(2).limit(2).toArray(function(err, result) {
            if (err) throw err;
            console.log(result);
            db.close();
      });
    });
    

    刪除集合

    我們可以使用 drop() 方法來刪除集合:

    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";
     
    MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
        if (err) throw err;
        var dbo = db.db("runoob");
        // 刪除 test 集合
        dbo.collection("test").drop(function(err, delOK) {  // 執行成功 delOK 返回 true,否則返回 false
            if (err) throw err;
            if (delOK) console.log("集合已刪除");
            db.close();
        });
    });
    
    版權聲明:本文為yhc166188原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/yhc166188/article/details/105175606

    智能推薦

    node.js基礎了解

    node.js的特點 單線程:只有一個線程執行任務 非堵塞I/O:在I/O耗時操作時,線程不堵塞 事件驅動:使用事件驅動程序往下繼續運行 node,js模塊化 規范:遵循common.js規范     加載模塊的時候同步。當遇到require() 語句時,會停下來等加載完成然后繼續往下執行。     暴露模塊的時候推薦...

    node.js基礎入門

    為什么學習node.js     node.js可以輔助前端開發,代替后端開發(但其還是不能和java比),node.js與php相比來說,他的優點是:性能高,開發效率高,應用范圍廣,其缺點是:新型語言,函數少,ide(開發環境,編譯器)不完善 什么是node.js?     node.js是基于chrome v8引擎的JavaScript運行環境。node...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    猜你喜歡

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    Linux C系統編程-線程互斥鎖(四)

    互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...

    統計學習方法 - 樸素貝葉斯

    引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...

    styled-components —— React 中的 CSS 最佳實踐

    https://zhuanlan.zhihu.com/p/29344146 Styled-components 是目前 React 樣式方案中最受關注的一種,它既具備了 css-in-js 的模塊化與參數化優點,又完全使用CSS的書寫習慣,不會引起額外的學習成本。本文是 styled-components 作者之一 Max Stoiber 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...

    精品国产乱码久久久久久蜜桃不卡