JavaScript 模塊化編程
網(wǎng)站越來越復雜,js代碼、js文件也越來越多,會遇到什么問題?
- 命名沖突;
- 文件依賴問題。
- 解決方案:模塊化開發(fā)。
什么是模塊化
- 代碼模塊化的例子:
- 日期模塊;
- 數(shù)學計算模塊;
- 日志模塊...
模塊化開發(fā)演變
- 模塊化開發(fā)思想的優(yōu)點:
- 開發(fā)效率高:一次開發(fā),多次使用;
- 維護方便:模塊之間有高偶爾低內(nèi)聚的特點。
- 1~4是關(guān)于命名沖突的問題,5是關(guān)于文件依賴的問題。
1. 全局函數(shù)
- 命名沖突,代碼可讀性差;
- 文件依賴的問題。
2. 命名空間-對象封裝
- 駝峰命名;
- 用命名空間的方式進行封裝(事先約定命名的規(guī)范的形式);
- 不能做到私有性封裝,對象里面的屬性和方法很容易被修改掉,很不安全。
3. 劃分私有空間
- 通過匿名函數(shù)自執(zhí)行的方法封裝模塊;
- 可以保護私有變量和方法。
4. 模塊的維護擴展
- 開閉原則,對修改關(guān)閉,對擴展開放。
- 增加了代碼的健壯性和容錯性。
5. 模塊的第三方依賴(文件依賴)
- 模塊職責唯一性
- 把依賴的模塊,通過依賴注入的形式,在你的參數(shù)上進行體現(xiàn),牽強的可以解決文件依賴的問題。
總結(jié)
- 最大的問題,規(guī)范的問題
- 如果在多人協(xié)作開發(fā)過程中,會有很大的問題
- 多人協(xié)作開發(fā)過程中:代碼的風格一定要統(tǒng)一
模塊化規(guī)范
服務(wù)器端模塊化規(guī)范
- CommonJS(http://www.commonjs.org/)
- Node.js(https://nodejs.org/)
瀏覽器端模塊化規(guī)范
- AMD
- RequireJS:優(yōu)先加載
- CMD
- SeaJS:懶加載
- commonjs:服務(wù)器端的規(guī)范
- node.js
SeaJS
一個基于CMD規(guī)范實現(xiàn)的模塊化開發(fā)解決方案;
作者:Alibaba 玉伯
官網(wǎng):http://seajs.org/
特性:
簡單友好的模塊定義規(guī)范
自然直觀的代碼組織方式
了解CMD規(guī)范,掌握使用SeaJS類庫構(gòu)建模塊化開發(fā)方式。
基本使用
1.引入 sea.js 庫
2.定義模塊
define(function(require, exports, module){ 模塊代碼 });
3.依賴模塊
require(‘模塊id’)
4.暴露接口
exports
module.exports
5.啟動模塊系統(tǒng)
seajs.use(‘模塊id’,function( 模塊對象 ){ 業(yè)務(wù)代碼 });
定義模塊 define
- 定義模塊 define(function(){})
- 函數(shù)體內(nèi)的方法屬性都屬于這個方法,對外有封裝性;解決了命名沖突問題,使js代碼有了封裝性;
- 直接調(diào)用 jQuery 插件等非標準模塊的方法 http://my.oschina.net/briviowang/blog/208587
1.先有規(guī)范,后有實現(xiàn)
2.在CMD規(guī)范中,一個模塊就是一個js文件
3.define 是一個全局函數(shù),用來定義模塊
4.define( factory )
對象 {} 這種方式,外部會直接獲取到該對象
字符串 ‘’ 同上
函數(shù) function( require, exports, module ){ // 模塊代碼 }
為了減少出錯,定義函數(shù)的時候直接把這三個參數(shù)寫上,而且順序不能調(diào)換
加載模塊 require
- 加載文件依賴、模塊依賴的,用于define函數(shù)體內(nèi)。
1.require(‘模塊id路徑字符串’)
用于根據(jù)一個模塊id加載該模塊
參數(shù)必須是一個字符串
該方法會得到 要加載的模塊中的 module.exports 對象
2.只能在模塊環(huán)境define中使用,define(factory)的構(gòu)造方法第一個參數(shù)必須命名為 require
3.不要重命名require函數(shù)或者在任何作用域中給 require 重新賦值
暴露接口 exports 和 module.exports
- module.exports曝露出一個完整的對象,只能扔一次,只能曝露出來一個;
- exports是module.exports的別名,可以用來單個屬性、方法、對象的曝露,用
.的形式,exports能做的事情module.exports也可以做
1.功能:通過給exports或module.exports動態(tài)的掛載變量、函數(shù)或?qū)ο螅獠繒@取到該接口;
2.exports 等價于 module.exports;
3.可以通過多次給exports 掛載屬性向外暴露;
4.不能直接給 exports 賦值;
5.如果想暴露單個變量、函數(shù)或?qū)ο罂梢酝ㄟ^直接給 module.exports 賦值 即可。
啟動模塊 seajs.use
- 加載入口模塊,我們把define定義的js就叫模塊;
- 這個用于在
html代碼里面的加載。
1.在調(diào)用 seajs 之前,必須先引入 sea.js 文件
2.通過 seajs.use() 函數(shù)可以啟動模塊,有三種形式
(‘模塊id’[,callback] ) 加載一個模塊,并執(zhí)行回調(diào)函數(shù)
( [ ‘模塊1’, ‘模塊2’ ] [, callback] ) 加載多個模塊,并執(zhí)行回調(diào)函數(shù)
callback 參數(shù)是可選的
其中,回調(diào)函數(shù)中的參數(shù)用來接收通過exports返回來的值
3.seajs.use 和 DOM ready 事件沒有任何關(guān)系
4.最好不要在 define 中 使用 seajs.use
其它
模塊標識
- 模塊標識就是一個
字符串,用來標識模塊; - 模塊標識
可以不包含后綴名 .js; - 以
./或../開頭的相對路徑模塊,相對于 require 所在模塊的路徑; - 不以
./或../開頭的頂級標識,會相對于模塊的基礎(chǔ)路徑解析(配置項中的base) - 絕對路徑:
http://127.0.0.1:8080/js/a.js - 相對路徑:
/js/a.js
高級配置SeaJS
| 屬性 | 說明 |
|---|---|
| <span style="color:red">alias</span> | 別名配置 |
| <span style="color:red">paths | 路徑配置 |
| vars | 變量配置 |
| map | 映射配置 |
| preload | 預(yù)加載項 |
| debug | 調(diào)試模式 |
| <span style="color:red">base | 基礎(chǔ)路徑 |
| charset | 文件編碼 |
requirejs
- 與seajs的區(qū)別:
- requirejs是優(yōu)先加載的;
- seajs是懶加載的,就是有拖延癥,用的時候才加載。
- 官方文檔:http://www.requirejs.cn/
node-lesson1
1.前端、后端都是干什么的?
- 前端:做靜態(tài)資源的,html、css、js、圖片;
- 后端:操控服務(wù)器的硬件的。
2.為什么學習node.js?
- 1.就業(yè)有市場;
- 2.有商業(yè)用途;
國內(nèi)一些創(chuàng)業(yè)公司用用的比較多,功夫熊(做上門保健的,美甲、按摩)
國外的一些大公司都有使用:Facebook、Twitter、Google
國內(nèi)的一些大公司:Alibaba(天貓所有的頁面都是通過Node提供的服務(wù))、Tencent、Baidu - 3.本身技術(shù)是有價值;
- 4.js開發(fā)。
3.什么是JavaScript?
- 一門腳本語言,需要嵌入html執(zhí)行。
4.瀏覽器中的JavaScript可以做什么?
- 校驗表單、操作dom等等
5.瀏覽器中的JavaScript不可以做什么?
- 操作服務(wù)器硬件。
6.瀏覽器與JavaScript是什么關(guān)系?
瀏覽器解析js,目的是為了讓計算機能看懂js(計算機看得懂01010101,機器碼、字節(jié)碼);
這個過程叫做編譯。
實際上是內(nèi)核(js引擎)去解析的:
引擎
1.轉(zhuǎn)化
汽油柴油等等--->轉(zhuǎn)化->成動能
模板+數(shù)據(jù)--->頁面
js代碼--->機器碼\字節(jié)碼
2.移植性
js引擎套一個殼子就是瀏覽器,寫js代碼傳給js引擎,可以操作硬件,這一套技術(shù)就構(gòu)成了node.js
node.js使用v8引擎去解析js(不在需要去考慮兼容性問題了)
7.JavaScript只可以運行在瀏覽器中嗎?
- 可以運行在瀏覽器中;
- 也可以運行在node中(因為使用了v8引擎)。
JavaScript的實現(xiàn)方式
| 瀏覽器 | JavaScript實現(xiàn)方式 |
|---|---|
| Firefox | SpiderMoney |
| IE | JScript |
| Safari | JavaScriptCore |
| Chrome | V8 |
| Microsoft Edge | ChakraCore |
什么是 Node?
1.Node.js是一個在瀏覽器之外可以解析和執(zhí)行JavaScript代碼的運行時環(huán)境,或者說是一個運行時平臺JavaScript是門語言,node是一門技術(shù);
2.Node.js的特性:無阻塞IO模型、事件驅(qū)動;
3.Node.js通常用來構(gòu)建提供實時服務(wù)的應(yīng)用程序。
node是js運行環(huán)境基于v8引擎的一個運行時;
特點:
用事件驅(qū)動、無阻塞的io模型;-
優(yōu)勢:
輕量、高效。- 輕量級也就意味著 運行速度快;
- 輕量級也就意味著有更好的 跨平臺 特性(平臺的差異性,兼容性);
node是門技術(shù)不是語言,它使用的語言是js
java --> java
.net --> c#
node --> js
-
Node.js 是一個 構(gòu)建于 谷歌 Chrome 瀏覽器的 V8 引擎之上的一個
JavaScript運行時環(huán)境。- Node.js可以解析和執(zhí)行 JavaScript 代碼。
- Node.js的事件驅(qū)動和非阻塞IO模型使得Node.js本身非常的輕量和高效;
-
Node.js' package ecosystem, npm, is the largest ecosystem of open source libraries in the world.
- 以前的客戶端中 JavaScript 庫 散列在互聯(lián)網(wǎng)的各個地方;
- npm 就是把大家經(jīng)常使用的一些開源庫 給組織到了一起。
Node 是一個可以解析和執(zhí)行 JavaScript 代碼的 運行時環(huán)境。
關(guān)于Node
1.可以在服務(wù)器端使用JavaScript了
2.統(tǒng)一了開發(fā)環(huán)境和語言,JavaScript無處不在
3.高性能的JavaScript引擎 – Google V8
4.誕生于2009年,由Ryan Dasl 發(fā)布,并且是開源的
5.Node.js同時支持Windows、Linux、Mac OSX
為甚嚒要學習node
全棧開發(fā)工程師
技能全面、學習能力強、溝通成本低、學習成本高;
掌握多種技能,獨立完成產(chǎn)品。
前端開發(fā)
html、css、JavaScript、jQuery、Angular、前端優(yōu)化、自動化框架等。
后端開發(fā)
Node.js構(gòu)建后臺服務(wù)。
移動端開發(fā)
HTML5、ionic、React native、微信等。。。
Node 的實現(xiàn)結(jié)構(gòu)
- V8 JavaScript 解析執(zhí)行引擎,ECMAScript;
- 中間層(提供了文件操作、網(wǎng)絡(luò)操作登陸接口)更加接近操作系統(tǒng)的接口供開發(fā)人員使用
- 硬件層
安裝與配置
3m安裝法 nvm npm nrm
安裝包的方式安裝
- 問題1:安裝了node 沒有卸載;
- 問題2:32和64搞混了;
- 問題3:拼寫錯誤,路徑錯誤;
- 下載地址:
- 一路下一步 next
- 如何確認是否安裝成功:
-
win + r,然后輸入cmd,然后敲回車 就可以進入 cmd 控制臺
-
nvm 安裝和管理我們的 Node.js版本
nvm的安裝方式,node.js version manager 是一個node的版本管理工具
為了解決node版本切換問題
右鍵在此電腦上點擊一下--》屬性---》系統(tǒng)---》高級系統(tǒng)設(shè)置---》環(huán)境變量
控制面板---》系統(tǒng)---》高級系統(tǒng)設(shè)置---》環(huán)境變量
NVM_HOME---C:\dev\nvm
NVM_SYMLINK--C:\dev\nodejs
新建一個path:%NVM_HOME%;%NVM_SYMLINK%
| nvm | 用法 |
|---|---|
| nvm list | 查看版本號 |
| nvm use 版本號、nvm use 版本號 32 | 用哪個版本(已經(jīng)下載過的版本) |
| nvm install 版本號、nvm install 版本號 32 | 下載相對應(yīng)版本 |
nvm下載的是二進制版本
控制臺基本使用
- 允許用戶可以在終端命令臺中與操作系統(tǒng)交互,其實就是輸入與輸出。
| 基本命令 | 說明 |
|---|---|
dir |
directory列出當前目錄下所有的條目,別名 ls 在 powershell 中可以使用 |
cd |
change directory 切換目錄 |
| mkdir、md | make directory創(chuàng)建一個文件夾 |
| rd | remove directory刪除文件夾 |
| del | delete刪除指定文件夾 |
| ren | rename改變文件名 |
| cls | clear screen清屏 |
path 環(huán)境變量
目的是為了在控制臺中的任何目錄都可以快速打開或者使用該可執(zhí)行文件;
環(huán)境變量就是用來存儲系統(tǒng)級別的變量;
-
添加環(huán)境變量
- 我的電腦 -> 右鍵選擇屬性 -> 高級系統(tǒng)設(shè)置 -> 切換到
高級面板 -> 環(huán)境變量 - 第一種方式:直接把可執(zhí)行文件所屬的目錄 放到 PATH 環(huán)境變量中(如果沒有PATH環(huán)境變量,自己新建)
- 第二種方式:新建一個環(huán)境變量,變量名規(guī)范:邏輯名_HOME 變量值:該可執(zhí)行文件所屬的目錄
- 注意:無論是直接添加的路徑還是引用的變量名,一定要用 英文的分號 區(qū)分開
- 引用變量名的時候,變量名兩邊都是
%
- 我的電腦 -> 右鍵選擇屬性 -> 高級系統(tǒng)設(shè)置 -> 切換到
-
> feiq:- 當你在控制臺中輸入一個程序的名字的時候,cmd默認把它當成一個可執(zhí)行文件去執(zhí)行了,優(yōu)先找當前目錄下是否有沒有一個叫做feiq.exe的可執(zhí)行文件,如果有,直接執(zhí)行打開;
- 如果沒有,cmd會進入 path 環(huán)境變量中一個目錄一個目錄的挨著查找里面是否有該可執(zhí)行文件。
REPL(Read-eval-print-loop) 運行環(huán)境
- 用來測試一下代碼的,repl和chrome的控制臺很像;
- 通過在控制臺中輸入
node敲回車就可以計入 REPL 運行環(huán)境; - 通過在REPL運行環(huán)境中,連續(xù)按兩次
Ctrl+C就可以退出 REPL 運行環(huán)境。
用node執(zhí)行js文件
- 在js文件當前目錄下---->node +文件名;
- 如果不在當前目錄下,node + 文件路徑的形式執(zhí)行:
- 相對路徑:
./當前路徑,../上級目錄; - 絕對路徑執(zhí)行js的方式:
node c:\Users\cena\Desktop\code\01helloworld.js。
Globals
global
- global表示Node所在的全局環(huán)境,類似于瀏覽器的window對象;
- 使用REPL環(huán)境查看global對象;
- 注意:在REPL中定義的變量默認就是全局;
- 總結(jié):
- global就表示Node中的全局命名空間,任何全局變量、函數(shù)或?qū)ο蠖际莋lobal的一個屬性;
- 在一個模塊中定義的變量、函數(shù)或方法只在該模塊中可用,但可以通過exports對象將其傳遞到模塊外部。
console(測試用)
斷言
- 斷言就是假定一個條件,如果條件成立則不輸出任何內(nèi)容,如果條件不成立則報錯還要輸出想要輸出的內(nèi)容。
console.assert(條件,條件不成立輸出的內(nèi)容);
var foo=3;
console.assert(foo==3,"失敗");
time()、timeEnd()
- 成對出現(xiàn),計算在兩個方法中間的代碼的運行時間,傳入的參數(shù)要一致。
console.time('test');
//code
console.timeEnd('test');
//參數(shù)幫我們記錄代碼的執(zhí)行時間
__dirname 和 __filename
__dirnamee:用來找到當前文件夾的路徑;;__filename:用來去到當前文件的全路徑。不知道代碼要才哪使用的時候,用于靈活的寫代碼取路徑的時候。
它們屬于模塊作用域,可以直接使用
它們兩個用來獲取路徑的,一般用于操作文件路徑的時候,才會用到
process
- process 是一個全局可用對象,用來和我們現(xiàn)在啟動中的node進行交互的。
| 指令 | 說明 |
|---|---|
| process.version | 取版Node的版本,比如v0.10.18 |
process.stdout.write(123123) |
在控制臺做標準輸出 |
| process.pid | 當前進程的進程號 |
| process.platform | 當前系統(tǒng)平臺,比如Linux |
| process.env | 指向當前shell的環(huán)境變量,比如process.env.HOME |
| process.stdout | 指向標準輸出 |
| process.stdin | 指向標準輸入 |
| process.stderr | 指向標準錯誤 |
fast-init
- 額外補充(裝逼用),可以通過命令行,快速加載已寫好的模板。
- 如需使用,請額外查文檔。
補充angular知識
- 如果定義一個controller為parentController;
- 里面還有一個controller,叫selController;
- 父控制器向子控制器傳值(內(nèi)容),使用$scope.broadcast("事件名","內(nèi)容");
- 子控制器向父控制器傳內(nèi)容使用$scope.emit("事件名","內(nèi)容");
模塊系統(tǒng)
node.js模塊化
一個js文件在node里面我們就理解為一個模塊;
require用來加載模塊;(都要使用相對路徑)
module.exports用來曝露屬性和方法的,因為模塊有封裝性,需要打破封裝性曝露方法和屬性來;
exports是module.exports的別名,exports可以做的事情,module.exports都可以做,exports只能用.的形式曝露屬性和方法。
模塊的種類
- 在Node.js中,模塊分為兩類:
第一類,核心模塊(原生模塊),node自帶,用`名稱`直接可以加載。
核心模塊:
fs:file system
異步讀文件:readFile(路徑,編碼,function(){});
同步讀文件:readFileSync(路徑,編碼格式);
http
os
path
querystring
url
...
第二類,文件模塊,用路徑加載;有一種特殊的文件模塊----->包,`可以用名字加載`。
- module 是一個全局對象,它的作用是存儲模塊信息的,每一個js是一個模塊,每一個模塊里面都有一個module,module里面還存儲了父子結(jié)構(gòu)。可以直接給module.exports賦值,但是給exports直接賦值是無效的,用屬性的形式去賦值的時候二者都有效。
2.2 優(yōu)先從緩存加載
common.js規(guī)范----->加載后,再次加載時,去緩存中取 module.exports
2.3 require參數(shù)解析
核心模塊是Node.js原生提供的加載核心模塊的時候,
不需要傳入路徑,因為Node.js已經(jīng)將核心模塊的文件代碼
編譯到了二進制的可執(zhí)行文件中了
在加載的過程中,原生的核心模塊的優(yōu)先級是是最高的
圖參數(shù)解析
-
./或../開始的相對路徑文件模塊- 在加載一個自己編寫的模塊的時候,最好使用__dirname 和 你要加載的模塊的文件名拼接。
以
/開始的絕對路徑文件模塊
1.在Linux或者MAc的操作系統(tǒng)中,/表示系統(tǒng)的根路徑
2.在Windows中,/表示當前文件模塊所屬的根磁盤路徑
3.不建議使用,了解
- 標識符中可以不包含擴展名
- Node會按照
.js、.node、.json的次序補足擴展名,依次嘗試,但是不建議省略,提高效率。
require不包含擴展名的時候,Node.js會按照
路徑.js 以后自己在加載js文件模塊的時候,就省略掉.js后綴就可以了
路徑.node 后綴為node的文件是c/c++寫的一些擴展模塊
路徑.json 如果是加載json文件模塊,最好加上后綴.json,能稍微的提高一點加載的速度
.json文件最終Node.js也是通過fs讀文件的形式讀取出來的,然后通過JSON.parse()轉(zhuǎn)換成一個對象
Node.js會通過同步阻塞的方式看這個路徑是否存在
依次嘗試,直到找到為止,
如果找不到,報錯
- require 加載包的時候
直接寫包名,先在包內(nèi)的node_modules,
目錄下查找,去父級目錄下的node_modules目錄下查找,如果找到就直接使用;否則
依次向上查找,直到根目錄。
3.包
- 還有一種特殊的文件模塊,其實就是包。
- 現(xiàn)象:你開發(fā)的一個功能模塊,還是以文件的形式散列的,你給別人使用的時候很麻煩。
- 包的作用:在模塊的基礎(chǔ)上進一步組織JavaScript代碼。
3.1 包的組成
包結(jié)構(gòu):
入口文件
index.js;-
包描述文件package.json:
name:包的名稱;
description:包的簡介;
version:包的版本號;
keywords:關(guān)鍵詞數(shù)組,用于npm中分類搜索;
author:包的作者;
main:配置包的入口,默認是模塊根目錄下的index.js;(可以修改,main和外面的入口文件一起修改)
dependencies:包的依賴項,npm會通過該屬性自動加載依賴包。
包名:“版本號”
包名:
>+版本號 下載大于某個版本號,npm會下最新版包名:
<+版本號 下載小于某個版本號,npm會下小于這個版本號最新版包名:
<=小于等于 一定會下你寫的這個版本,除非沒有你寫的這個版本包名:
>=大于等于 下載最新版包名:
*、" "、X任意 npm會給你下最新版包名:
~+版本號 會去下約等于這個版本的最新版,在大版本不變的情況下下一個比較新的版本包名:
^+版本號 不躍遷版本下載,^2.1.0 npm會下載大版本不變,去下載2.x.x版本里的最近版scripts:指定了運算腳本命令的npm命令行縮寫,例如start。
Bin:存放可執(zhí)行二進制文件的目錄;
Lib:存放JavaScript代碼的目錄;
Doc:存放文檔的目錄;
Test:存放單元測試用例的代碼。
其中index.js和package.json兩個文件為必須文件。
package.json的創(chuàng)建
方法一:在當前文件夾下
npm init,然后根據(jù)提示填內(nèi)容即可。-
方二:通過fast-init(npm install -g fast-init)。
package.json
包的描述文件package.json文件內(nèi)部就是一個JSON對象,該對象的每一個成員就是當前項目的一項設(shè)置,
比如name就是項目名稱,version就是項目的版本號。在模塊的加載機制中,有一個main屬性是非常重要的,它很大意義上決定了包要導出的模塊位置。
所有的包必須要放在
node_modules文件夾下,該文件夾和要引用包的文件同級。
npm的基本使用
基于Node.js開發(fā)的包的托管網(wǎng)站;
Node.js包管理工具。
npm :基于包的規(guī)范實現(xiàn)的一個包管理工具。
npm init:初始化一個package.json文件;
npm install 包名:安裝一個包
當執(zhí)行npm install的時候,它會自動跑到npm的網(wǎng)站,然后找到該包的github地址,找到之后,下載這個壓縮包,然后在執(zhí)行npm install的當前目錄下找一個叫做node_modules目錄。如果找到,直接解壓這個壓縮包,到node_modules目錄下;如果找不到,則新建一個node_modules目錄,解壓到該目錄。
-
npm install -g 包名:表示全局安裝
- npm在安裝的時候,在全局設(shè)置了一個安裝目錄,只要是全局安裝就會把包安裝到這個目錄里面去。只要是全局安裝就是安裝命令行工具;
npm install 縮寫:npm i
當執(zhí)行npm install的時候,會自動在當前目錄中查找package.json文件;如果找到,找里面的 dependencies 字段,安裝該字段中所有依賴的項;
-
npm docs 包名:
- 打開包相對應(yīng)的文檔
非常有用;
- 打開包相對應(yīng)的文檔
-
npm install --save 包名: 生產(chǎn)環(huán)境
- 縮寫:npm i -S jquery@3.*
咱們以后在做項目的時候,先初始化一個package.json文件,在安裝第三方包依賴的時候,必須使用npm install --save express,添加依賴項到package.json文件中,
實際就是添加到dependencies字段中;-
npm install -save-dev 開發(fā)環(huán)境
- 縮寫:npm i -D jquery@3.*
咱們以后在做項目的時候,先初始化一個package.json文件,
在安裝第三方包依賴的時候,必須使用npm install --save express,添加依賴項到package.json文件中,
實際就是添加到devDependencies字段中。npm config set prefix “路徑”:修改全局安裝目錄,不建議使用,建議去文件夾里面改 C:\Users\用戶名 里面有一個 .npmrc文件,去里面改prefix = C:\dev\npm (寫你的路徑);去全局的環(huán)境變量path里把C:\dev\npm 路徑加進去。
npm root -g:查看全局包安裝路徑;
npm list:查看當前目錄下安裝的所有包;
npm list -g:查看全局包的安裝路徑下所有的包;
npm uninstall 包名:卸載當前目錄下某個包;
npm uninstall –g 包名:卸載全局安裝路徑下的某個包;
npm update 包名:更新當前目錄下某個包;
npm update –g 包名:更新某個全局工具包;
npm update:更新當前目錄下安裝的所有包;
npm update –g:更新全局所有的工具包。
npm 這種東西的最終的目的就是:讓你的開發(fā)模式工程化,都依靠工具來管理
nvm npm nrm
3m
nvm node版本的管理工具
npm node的包管理工具
nrm npm的數(shù)據(jù)源管理工具
npm install -g nrm
4.文件操作
4.1箭頭函數(shù)(ES6語法)
箭頭函數(shù)就是一種語法糖;
語法糖是一種語法,用這種語法能嘗到甜頭,能是編程高效。
當函數(shù)體有一個參數(shù)有返回值的時候
var foo=function(v){ return v;}
//改寫為箭頭函數(shù)
var foo=v=>v;
- 當函數(shù)體沒有參數(shù)有返回值的時候
var foo=function(){ return v;}
var foo=()=>v;
- 當函數(shù)體有多個參數(shù)有返回值的時候
var foo=function(v1,v2){ return v1+v2;}
var foo=(v1,v2)=>v1+v2;
- 當函數(shù)體有多個參數(shù)沒有返回值的時候
var foo=function(v1,v2){
console.log(v1); console.log(v2);
}
var foo=(v1,v2)=>{
console.log(v1); console.log(v2);
};
4.2文件讀寫
- fs.readFile() 讀文件
fs.readFile(file, [options], callback)
//file 讀文件的路徑
//options 用[]包裹的可選參數(shù),object {"encoding":"uft8","flag":"r"} string 'utf8'
//callback function callback函數(shù)里面有兩個參數(shù)
//err表示錯誤對象,如果readFile發(fā)生錯誤了,在callback函數(shù)里面會回返回err,err對象里面存著錯誤信息
//如何讀文件成功,err為null
//data就是讀文件,讀出來的內(nèi)容。
- fs.access(path,[mode], callback) 用來判斷文件是否存在
//path 判斷路徑是否正確(也可以判斷文件)'./pic'
//mode一般不用,默認就可以了,用的話是用來判斷文件是否可讀可寫可執(zhí)行
//callback 只有一個參數(shù)err,錯,文件有問題
其它
作業(yè)
2.npm 和package.json結(jié)合著連
npm init 初始化package.json
npm install 先配置package.json里的devDependencies dependencies字段
npm i -S +包名 npm install –save 不光能下載包,還能把依賴添加到package.json
npm i -D +包名 npm install –save-dev 不光能下載包,還能把依賴添加到package.json
npm docs 包名 查看包的相關(guān)文件 jquery、mongoose、http-poster
npm list 當前目錄有什么包,檢測node_modules里面有什么
npm install –g 包名 全局安裝 cnpm、nrm
3.cnpm
4.nrm
安裝目錄npm install -g nrm
nrm ls 查看數(shù)據(jù)源
nrm test 測試你的網(wǎng)連那個npm的數(shù)據(jù)源快
nrm use 切換數(shù)據(jù)源
5.閱讀參考文獻 樸靈 require
閱讀參考文獻 package.json全字段解析
6.github自己玩玩