1: 如何全局安裝一個 node 應用?
全局安裝:package會被下載到到特定的系統(tǒng)目錄下( /usr/local/lib/cdnode_modules/)型酥,安裝的package能夠在所有目錄下使用。
cd 包名
2: package.json 有什么作用将宪?
//package.json
{
"name": "plearner-demo0",//該node_module的名字
"version": "1.0.0",//向npm發(fā)布時闯捎,該node_module的版本號
"description": "this is a desrtiption of my test",// 對該模塊的描述
"main": "text.js",//程序的入口文件,require該模塊時妖碉,該模塊從此文件開始執(zhí)行
"scripts": {//執(zhí)行命令行忽肛,目的是便于打造自動化流程法严,比如說在build中寫可以壓縮的方法损敷。
//除了start和test執(zhí)行方式為npm start/test磺樱,其他均為 npm run XXX
"test": "echo peng"
},
"keywords": [//在npm網(wǎng)站搜索時罪帖,通過搜索該關(guān)鍵字矢否,可以找到該模塊
"test"
],
"author": "plearner",//模塊的作者
"license": "ISC",
"dependencies": {//該模塊運行時需要依賴的其他模塊尝蠕,當其他人npm install該模塊時橄唬,也會把該模塊的依賴模塊一并安裝
"marked": "^0.3.6"
},
"devDependencies": {//編寫該模塊時牲迫,采用的開發(fā)工具蚀狰,非必須手销,當其他人npm install該模塊時苫幢,不會安裝此開發(fā)依賴工具
"easytpl": "^1.0.4"
}
}
3: npm install --save app 與 npm install --save-dev app有什么區(qū)別?
- npm install --save app 和npm install --save-dev app 兩個都是在當前文件夾安裝app包访诱,并且都是這個包所依賴的其他包
- --save 執(zhí)行時,會自動更新 packge.json中的dependencies 韩肝。而 --save-dev 會更新 devDependencies触菜, 開發(fā)依賴包。當我們發(fā)布包成功哀峻,別人下載時涡相,會自動下載 dependencies。而開發(fā)依賴的包剩蟀,不會被用戶下載催蝗。
4: node_modules的查找路徑是怎樣的?
當require一個模塊xxx時,會首先在當前目錄下尋找node_modules下的xxx育特,若沒有丙号,則返回到上一級目錄的node_modules下尋找xxx,最終會找到根目錄下node_modules下的xxx。
所以全局安裝到根目錄后才可以在任何文件目錄下使用命令犬缨。
5: npm3與 npm2相比有什么改進喳魏?yarn和 npm 相比有什么優(yōu)勢?
npm3對模塊依賴目錄的層次進行了改進
npm是node.js的包依賴管理工具,不過有的時候項目依賴過多怀薛,造成路徑過深刺彩,超過了操作系統(tǒng)的文件深度限制。
npm3將傳統(tǒng)的嵌套結(jié)構(gòu)改為平鋪結(jié)構(gòu)枝恋。
即包以及包依賴的其他模塊將會以同一層級安裝在包使用者的node_modules下 迂苛,如果版本有沖突,才會采用npm2的嵌套方式安裝在各個包下鼓择。
npm3對模塊依賴目錄層次的改進
Yarn是一個新的Javascript包管理器
它由Facebook, Google, Exponent and Tilde開發(fā)者共同開發(fā)完成三幻。Yarn 不是 NPM 的fork版本,而是它的重新設(shè)計呐能,Yarn 定位為"快速念搬、可靠、安全的依賴管理工具"摆出,目標是解決團隊開發(fā)中使用 NPM 遇到的問題朗徊。
NPM 一些潛在的問題:
- 嵌套依賴 (npm 3.0版本已修復)
- 串行安裝
- 單一個 package 來源(npmjs.com)
- 需要網(wǎng)絡(luò)來安裝軟件包(盡管我們可以創(chuàng)建一個臨時緩存)
- 允許程序包在安裝時運行代碼(不利于安全性)
- 不確定的包狀態(tài)(不能確定項目的所有副本使用相同的包版本)
Yarn 解決方案:
- 單依賴包結(jié)構(gòu): 可以使用單一版本的依賴包,安裝更快速偎漫,占用磁盤空間更少
- 并行安裝: 并行下載依賴包爷恳,減少下載時間
- 多個包來源: Yarn 讀取和安裝 npmjs.com 和 Bower安裝包,如果有個渠道down掉了象踊,可以從另一個渠道下載包并安裝
- 自動重試: 單個網(wǎng)絡(luò)請求失敗不會導致安裝失敗温亲,請求在失敗后會重試,這解決了由于臨時網(wǎng)絡(luò)問題而產(chǎn)生的構(gòu)建異常
- 兼容 NPM: 從 NPM 切換到 Yarn 不需要做特殊兼容處理
- yarn.lock: 用來記錄項目使用每個 javascript 包的確切版本杯矩。當將此文件提交至 SVN栈虚、GIT 等代碼維護工具,可以保證項目的所有開發(fā)人員共享一套依賴包的版本號史隆。
在package.json中魂务,依賴的包版本可以被指定為一個范圍,也可以不帶版本號泌射。這個可能會導致一種問題粘姜,團隊內(nèi)不同開發(fā)人員使用不同版本的軟件包。從包管理器(Bundler)中借鑒熔酷,Yarn 創(chuàng)建了 yarn.lock文件孤紧,用來記錄項目使用每個包的確切版本。
6: webpack是什么纯陨?和其他同類型工具比有什么優(yōu)勢坛芽?
webpack 是一款模塊加載器兼打包工具留储,它能把各種資源 JS翼抠、CSS咙轩、圖片等都作為模塊來使用和處理。
webpack的核心是一切皆模塊的思想阴颖,所以活喊,任何模塊,CSS量愧,圖片钾菊,字體,都被webpack當做模塊來處理偎肃,我們只需要在需要這些模塊的時候來require煞烫。
webpack的優(yōu)勢一:Code Splitting代碼分割
過去,傳輸模塊時有兩個極端:
-
1.一個請求獲取一個模塊
(requirejs 每一個require的模塊累颂,對應的都是一條網(wǎng)絡(luò)請求)- 優(yōu)點:只傳送所需的模塊
- 缺點:許多請求意味著很多開銷
- 缺點:因為請求的延遲滞详,程序啟動緩慢
-
2.一個請求獲取所有模塊
(r.js 把所有的模塊都打包成一個網(wǎng)絡(luò)請求)- 優(yōu)點:請求開銷減少,延遲小
- 缺點:暫時并不所需的模塊也被傳送
webpack將請求的模塊組拆分成許多小塊紊馏。
被復用的模塊組被一次請求最開始就獲取料饥,最初不需要的模塊的塊則可以按需加載。 擁有初始下載量小朱监,并在應用程序請求時按要求下載代碼的優(yōu)勢岸啡。
webpack的優(yōu)勢二:Loaders加載器
通過 loader 的轉(zhuǎn)換,任何形式的資源都可以視作模塊赫编,比如 CommonJs 模塊巡蘸、 AMD 模塊、 ES6 模塊擂送、CSS赡若、圖片、 JSON团甲、Coffeescript逾冬、 LESS 等。它可以取代gulp的壓縮圖片打包js等功能
webpack的優(yōu)勢三:Clever parsing解析
用 commonJS 來書寫躺苦,對 AMD/CMD 支持也很全面身腻。
webpack的優(yōu)勢四:插件系統(tǒng)
webpack具有豐富的插件系統(tǒng)。
7:npm script是什么匹厘?如何使用嘀趟?
npm script 是利用packge.json中 script 這個屬性,制定一個工作流愈诚。
簡化命令行的使用她按。
"scripts": { //執(zhí)行命令行牛隅,目的是便于打造自動化流程,比如說在build中寫可以壓縮的方法酌泰。除了start和test執(zhí)行方式為npm start/test媒佣,其他均為 npm run XXX
"build": "echo build...",
"start": "echo start...",
"test": "echo \"Error: no test specified\" && exit 1"
}
8: 使用 webpack 替換 入門-任務15中模塊化使用的 requriejs
9:gulp是什么?使用 gulp 實現(xiàn)圖片壓縮陵刹、CSS 壓縮合并默伍、JS 壓縮合并
gulp是一款nodejs的插件,gulp能進行圖片壓縮衰琐,js打包實現(xiàn)前端工作流也糊,它還含有豐富的插件,是前端工作中一款簡單好用的利器羡宙。
glup安裝及使用
$npm install gulp-cli -g //全局安裝gulp,作為命令行工具是不能require到的
$npm install gulp -D //在當前項目的目錄下安裝gulp狸剃,才能require到,等于 npm install --save-dev gulp
$touch gulpfile.js //新建gulpfile.js文件
$gulp --help
gulp是一個對象狗热,對象里有如下幾個方法
gulp.src | gulp.dest | gulp.task | gulp.watch
參見gulp文檔
gulp.src(globs[, options]):把哪些文件放入glup中處理钞馁,采用正則表達式的寫法,可以是字符串或者數(shù)組斗搞,通過gulp轉(zhuǎn)化成數(shù)據(jù)流
gulp.dest(path[, options]) 將數(shù)據(jù)流導出成文件
gulp.task(name [, deps] [, fn]) 創(chuàng)建任務指攒,一個任務可以認為是一個流水線 [, deps] 依賴是并行的
gulp.watch(glob [, opts], tasks) or gulp.watch(glob [, opts, cb]) 監(jiān)測文件內(nèi)容的改動
gulp運行
終端運行g(shù)ulp taskname
如果想要直接gulp就能運行,可以將原taskname改為default或者新建一個task僻焚,taskname為default
使用 gulp 實現(xiàn)圖片壓縮允悦、CSS 壓縮合并、JS 壓縮合并
#gulpfile.js文件中
var gulp = require('gulp');
//引入組件
var minifycss = require('gulp-minify-css'),//css壓縮
uglify = require('gulp-uglify'),//js壓縮
concat = require('gulp-concat'), //合并文件
rename = require('gulp-rename'), //重命名
clean = require('gulp-clean'),//清空文件夾
minhtml = require('gulp-htmlmin'),//html壓縮
jshint = require('gulp-jshint'),//js代碼規(guī)范性檢查
imagemin = require('gulp-imagemin');//圖片壓縮
gulp.task('html',function(){
return gulp.src('src/*.html')
.pipe(minhtml({collapseWhitespace: true}))
.pipe(gulp.dest('dist'));
});
gulp.task('css',function(argument){
gulp.src('src/css/*.css')
.pipe(concat('merge.min.css'))
.pipe(minifycss())
.pipe(gulp.dest('dist/css/'));
});
gulp.task('js',function(argument){
gulp.src('src/js/*.js')
.pipe(jshint())
.pipe(jshint.reporter('default'))
.pipe(concat('merge.js'))
.pipe(rename({
suffix: '.min'
}))
.pipe(uglify())
.pipe(gulp.dest('dist/js/'));
});
gulp.task('img',function(argument){
gulp.src('src/imgs/*')
.pipe(imagemin())
.pipe(gulp.dest('dist/imgs'));
});
gulp.task('clear', function(){ //清空文件夾
gulp.src('dist/*',{read: false})
.pipe(clean());
});
gulp.task('build',['html','css','js','img']);//運行g(shù)ulp build的時候虑啤,相當于把html,css,js,img都運行了
10: 開發(fā)一個 node 命令行天氣應用用于查詢用戶當前所在城市的天氣隙弛,發(fā)布到 npm 上去。
在npm上搜索hunger-yuhuan2-weather
demo4/index.js
#!/usr/bin/env node //指明用node執(zhí)行
var axios = require('axios')
console.log(process.argv) //process.argv獲取輸入的參數(shù)
var data = {}
if(process.argv[2]){
data.params = {
city: process.argv[2]
}
}
axios.get('http://api.jirengu.com/weather.php', data) //引用axios方法狞山,類似的方法還有request
.then(function (response) {
var weather = response.data.results[0].weather_data[0]
console.log(weather.date)
console.log(weather.temperature)
console.log(weather.weather + ',' + weather.wind)
console.log('PM25:' + response.data.results[0].pm25)
})
.catch(function (error) {
console.log(error);
})
demo4/package.json
{
"name": "hunger-yuhuan2-weather",
"version": "1.0.0",
"description": "",
"main": "index.js",
"bin":{
"weather-yuhuan": "./index.js"
},
"scripts": { //執(zhí)行命令行全闷,目的是便于打造自動化流程,比如說在build中寫可以壓縮的方法萍启。除了start和test執(zhí)行方式為npm start/test总珠,其他均為 npm run XXX
"build": "echo build...",
"start": "echo start...",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "yuhuan",
"license": "ISC",
"dependencies": {
"axios": "^0.16.2"
}
}
還需要引入依賴axios
npm install --save axios
最后登陸&發(fā)布包
npm login
npm publish
使用
在控制臺輸入weather-yuhuan顯示當前所在城市天氣
輸入weather-yuhuan XXX 顯示XXX城市天氣