什麼是 JavaScript?+是一個腳本語言+運行在瀏覽器(瀏覽器的js解析內核 v8)+實現用戶的交互 (interactive)php
變量 賦值 循環 邏輯 判斷 分支 對象 函數。。。。html
dom 操做前端
bom 操做java
ajax node
JavaScript 的運行環境?+瀏覽器內核解析內核 es6python
瀏覽器中的 JavaScript 能夠作什麼?linux
瀏覽器中的 JavaScript 不能夠作什麼?(不安全)+訪問數據庫+不能對文件進行操做 +對os 進行操做+緣由 是不安全 和瀏覽器運行機制有關git
在開發人員能力相同的狀況下編程語言的能力取決於什麼?es6
+cordova hbuilder 平臺 platform+java java虛擬機 (運行平臺)+php php虛擬機+c# .net framework mono+js 解析內核 chrome v8 github
JavaScript 只能夠運行在瀏覽器中嗎?+不是
node js 不是由於js 產生的
node 選擇了js
Ryan dahl
2009 2 月份 node有想法
2009 5 月份 githup 開源
2009 11月份 jsconf 講解推廣node
2010年末 被xxx公司收購
2018 發佈有重大bug
npm
githup 世界上最大的同性交友網站 碼雲
Node.js 是一個基於Chrome V8 引擎的JavaScript運行環境
Node.js使用了一個事件驅動、非阻塞式I/O的模型,使其輕量又高效
Node.js的包管理工具npm,是全球最大的開源庫生態系統
npm 插件官網:https://www.npmjs.com/
安裝包安裝
官網下載對應的安裝包
一路next
nvm安裝(有一個相似的工具:n)
Node Version Manager(Node版本管理工具)
因爲之後的開發工做可能會在多個Node版本中測試,並且Node的版本也比較多,因此須要這麼款工具來管理
基本命令
nvm -v 查看版本號
nvm list 查看列表
nvm install 版本號 安裝node
nvm uninstall 版本號 卸載node
node版本常識
偶數版本爲穩定版 (0.6.x ,0.8.x ,0.10.x)
奇數版本爲非穩定版(0.7.x ,0.9.x ,0.11.x)
LTS(Long Term Support)
操做方式:
從新下載最新的安裝包;
覆蓋安裝便可;
問題:
之前版本安裝的不少全局的工具包須要從新安裝
沒法回滾到以前的版本
沒法在多個版本之間切換(不少時候咱們要使用特定版本)
切換當前目錄(change directory):cd
建立目錄(make directory):mkdir
查看當前目錄列表(directory):dir
別名:ls(list)
清空當前控制檯:cls
別名:clear
刪除文件:del
別名:rm
注意:全部別名必須在新版本的 PowerShell (linux系統)中使用
Python環境丟失
Node中有些第三方的包是以C/C++源碼的方式發佈的,須要安裝後編譯,確保全局環境中可使用python命令,python 版本推薦2.7.0
環境變量丟失
部分電腦安裝完畢以後沒有環境變量須要手動配置
Windows中環境變量分爲系統變量和用戶變量
環境變量的變量名是不區分大小寫的
PATH 變量:只要添加到 PATH 變量中的路徑,均可以在任何目錄下
目的能夠在任何地方調起node命令
##模塊,包 commonjs
前端模塊化:AMD,CMD,Commonjs
Node 應用由模塊組成,採用 CommonJS 模塊規範。
每一個文件就是一個模塊,有本身的做用域。在一個文件裏面定義的變量、函數、類,都是私有的,對其餘文件不可見。
CommonJS規範規定,每一個模塊內部,module變量表明當前模塊。這個變量是一個對象,它的exports屬性(即module.exports)是對外的接口。加載某個模塊,實際上是加載該模塊的module.exports屬性。
var x = 5;
var addX = function (value) {
return value + x;
};
module.exports.x = x;
module.exports.addX = addX;
require方法用於加載模塊。
var example = require('./example.js');
console.log(example.x); // 5
console.log(example.addX(1)); // 6
內置模塊
const process = require('process')
const path = require('path')
console.log(process.version)
console.log(path.resolve('../'))
第三方模塊
const request=require("request");
console.log(request)
request.get('http://api.douban.com/v2/movie/in_theaters', (err, response, body) => {
if (!err) {
// console.log(body);
console.log(JSON.parse(body))
} else {
console.log(err);
}
})
自定義模塊
###npm 使用入門
安裝:無需安裝
查看當前版本:
$ npm -v
更新:
$ npm install npm@latest -g
初始化工程
$ npm init
$ npm init --yes 默認配置
安裝包
使用npm install會讀取package.json文件來安裝模塊。安裝的模塊分爲兩類 dependencies和devDependencies,分別對應生產環境須要的安裝包和開發環境須要的安裝包。
$ npm install
$ npm install <package_name>
$ npm install <package_name> --save
$ npm install <package_name> --save-dev
更新模塊
$ npm update
卸載模塊
$ npm uninstall <package_name>
$ npm uninstall --save lodash
配置npm源
臨時使用, 安裝包的時候經過--registry參數便可
$ npm install express --registry https://registry.npm.taobao.org
全局使用
$ npm config set registry https://registry.npm.taobao.org
// 配置後可經過下面方式來驗證是否成功
npm config get registry
// 或
npm info express
cnpm 使用
// 安裝cnpm
npm install -g cnpm --registry=https://registry.npm.taobao.org
// 使用cnpm安裝包
cnpm install express
node 經常使用內置api
(1) URL 網址解析 解析URL相關網址信息 url.parse(urlString[, parseQueryString[, slashesDenoteHost]]) url.format(urlObject) url.resolve(from, to)(2) QueryString 參數處理 querystring.escape(str) querystring.unescape(str) querystring.parse(str[, sep[, eq[, options]]]) querystring.stringify(obj[, sep[, eq[, options]]])(3) HTTP 模塊概要 http.createServer(options) http.get(options[, callback]) 簡易的爬蟲 代理跨域處理(4) 事件 events 模塊(5) 文件fs模塊 打印目錄樹(6) Stream 流模塊 歌詞播放 音樂下載(8) request 方法
二、Node.js 基礎應用一、應用 HTTP 模塊編寫一個小爬蟲工具(1) 利用爬蟲獲取「拉勾網」首頁列表數據 (2) 經過 npm 安裝 cheerio 模塊得到數據二、後端表單的提交要求:(1) 應用 request post 模擬提交表單
Node中文件讀取的方式主要有:
fs.readFile(file[, options], callback(error, data))
fs.readFile('c:\\demo\1.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
fs.readFileSync(file[, options])
try {
const data = fs.readFileSync('c:\\demo\1.txt', 'utf8');
console.log(data);
} catch(e) {
// 文件不存在,或者權限錯誤
throw e;
}
fs.createReadStream(path[, options])
const stream = fs.createReadStream('c:\\demo\1.txt');
let data = ''
stream.on('data', (trunk) => {
data += trunk;
});
stream.on('end', () => {
console.log(data);
});
因爲Windows平臺下默認文件編碼是GBK,在Node中不支持,能夠經過iconv-lite解決
const readline = require('readline');
const fs = require('fs');
const rl = readline.createInterface({
input: fs.createReadStream('sample.txt')
});
rl.on('line', (line) => {
console.log('Line from file:', line);
});
Node中文件寫入的方式主要有:
fs.writeFile(file, data[, options], callback(error))
fs.writeFile('c:\\demo\a.txt', new Date(), (error) => {
console.log(error);
});
fs.writeFileSync(file, data[, options])
try {
fs.writeFileSync('c:\\demo\a.txt', new Date());
} catch (error) {
// 文件夾不存在,或者權限錯誤
console.log(error);
}
fs.createWriteStream(path[,option])
var streamWriter = fs.createWriteStream('c:\\demo\a.txt');
setInterval(() => {
streamWriter.write(`${new Date}\n`, (error) => {
console.log(error);
});
}, 1000);
###node中的異步操做
fs模塊對文件的幾乎全部操做都有同步和異步兩種形式
例如:readFile() 和 readFileSync()
區別:
同步調用會阻塞代碼的執行,異步則不會
異步調用會將讀取任務下達到任務隊列,直到任務執行完成纔會回調
異常處理方面,同步必須使用 try catch 方式,異步能夠經過回調函數的第一個參數
console.time('sync');
try {
var data = fs.readFileSync(path.join('C:\\Users\\iceStone\\Downloads', 'H.mp4'));
// console.log(data);
} catch (error) {
throw error;
}
console.timeEnd('sync');
console.time('async');
fs.readFile(path.join('C:\\Users\\iceStone\\Downloads', 'H.mp4'), (error, data) => {
if (error) throw error;
// console.log(data);
});
console.timeEnd('async');
what is Promise *Promise是抽象異步處理對象以及對其進行各類操做的組件。Promise並非從JavaScript中發祥的概念。Promise最初被提出是在 E語言中, 它是基於並列/並行處理設計的一種編程語言。如今JavaScript也擁有了這種特性,這就是JavaScript Promise
使用了回調函數的異步處理
----
getAsync("fileA.txt", function(error, result){
if(error){// 取得失敗時的處理
throw error;
}
// 取得成功時的處理
});
----
<1> 傳給回調函數的參數爲(error對象, 執行結果)錯誤優先處理
使用了回調函數的異步處理
----
var promise = getAsyncPromise("fileA.txt");
promise.then(function(result){
// 獲取文件內容成功時的處理
}).catch(function(error){
// 獲取文件內容失敗時的處理
});
----
<1> 返回promise對象
建立Promise對象 *
var promise = new Promise(function(resolve, reject) {
// 異步處理
// 處理結束後、調用resolve 或 reject
resolve('成功處理')
reject('錯誤處理')
});
使用實例 *
建立一個priomise 對象並返回new Promise(fn)
在fn 中指定異步等處理
處理結果正常的話,調用resolve(處理結果值)
處理結果錯誤的話,調用 reject(Error對象)
function asyncFunction() {
return new Promise(function (resolve, reject) {
setTimeout(function () {
resolve('Async Hello world');
}, 16);
});
}
asyncFunction().then(function (value) {
console.log(value); // => 'Async Hello world'
}).catch(function (error) {
console.log(error);
});
Promise的狀態
用new Promise 實例化的promise對象有如下三個狀態。
"has-resolution" - Fulfilled resolve(成功)時。
"has-rejection" - Rejected reject(失敗)時
"unresolved" - Pending 既不是resolve也不是reject的狀態。也就是promise對象剛被建立後的初始化狀態等
promise對象的狀態,從Pending轉換爲Fulfilled或Rejected以後, 這個promise對象的狀態就不會再發生任何變化。
也就是說,Promise與Event等不一樣,在.then 後執行的函數能夠確定地說只會被調用一次。
另外,Fulfilled和Rejected這兩個中的任一狀態均可以表示爲Settled(不變的)。
Settledresolve(成功) 或 reject(失敗)。
從Pending和Settled的對稱關係來看,Promise狀態的種類/遷移是很是簡單易懂的。
當promise的對象狀態發生變化時,用.then 來定義只會被調用一次的函數。
在文件操做的過程當中,都必須使用物理路徑(絕對路徑),path模塊提供了一系列與路徑相關的 API
console.log('join用於拼接多個路徑部分,並轉化爲正常格式');
const temp = path.join(__dirname, '..', 'lyrics', './友誼之光.lrc');
console.log(temp);
console.log('獲取路徑中的文件名');
console.log(path.basename(temp));
console.log('獲取路徑中的文件名並排除擴展名');
console.log(path.basename(temp, '.lrc'));
console.log('====================================');
console.log('獲取不一樣操做系統的路徑分隔符');
console.log(process.platform + '的分隔符爲 ' + path.delimiter);
console.log('通常用於分割環境變量');
console.log(process.env.PATH.split(path.delimiter));
console.log('====================================');
console.log('獲取一個路徑中的目錄部分');
console.log(path.dirname(temp));
console.log('====================================');
console.log('獲取一個路徑中最後的擴展名');
console.log(path.extname(temp));
console.log('====================================');
console.log('將一個路徑解析成一個對象的形式');
const pathObject = path.parse(temp);
console.log(pathObject);
console.log('====================================');
console.log('將一個路徑對象再轉換爲一個字符串的形式');
// pathObject.name = '我終於失去了你';
pathObject.base = '我終於失去了你.lrc';
console.log(pathObject);
console.log(path.format(pathObject));
console.log('====================================');
console.log('獲取一個路徑是否是絕對路徑');
console.log(path.isAbsolute(temp));
console.log(path.isAbsolute('../lyrics/愛的代價.lrc'));
console.log('====================================');
console.log('將一個路徑轉換爲當前系統默認的標準格式,並解析其中的./和../');
console.log(path.normalize('c:/develop/demo\\hello/../world/./a.txt'));
console.log('====================================');
console.log('獲取第二個路徑相對第一個路徑的相對路徑');
console.log(path.relative(__dirname, temp));
console.log('====================================');
console.log('以相似命令行cd命令的方式拼接路徑');
console.log(path.resolve(temp,