1. 如何全局安裝一個 node 應用?
npm install -g xxx
2.package.json 有什么作用滚朵?
package.json文件,定義了這個項目所需要的各種模塊蜻拨,以及項目的配置信息(比如名稱掐场、版本、許可證等元數(shù)據(jù))旋膳。npm install
命令根據(jù)這個配置文件澎语,自動下載所需的模塊,也就是配置項目所需的運行和開發(fā)環(huán)境验懊。
下面是一個比較完整的package.json文件擅羞。
{
//name是項目名稱
"name": "Hello World",
//version是版本號 一般遵守(大版本.次要版本.小版本”的格式)
"version": "0.0.1",
//author作者
"author": "張三",
//description描述
"description": "第一個node.js程序",
//keyword是關鍵字方便npm search的搜索
"keywords":["node.js","javascript"],
"repository": {
"type": "git",
"url": "https://path/to/url"
},
//license是指定一個許可證,讓人知道使用的權(quán)利和限制的
"license":"MIT",
//engines你可以指定工作的node的版本
"engines": {"node": "0.10.x"},
//bugs是你項目的提交問題的url和(或)郵件地址鲁森。你可以指定一個或者指定兩個祟滴。如果你只想提供一個url,那就不用對象了歌溉,字符串就行垄懂。
"bugs":{"url":"http://path/to/bug","email":"bug@example.com"},
"contributors":[{"name":"李四","email":"lisi@example.com"}],
//scripts指定了運行腳本命令的npm命令行縮寫,比如start指定了運行npm run start時痛垛,所要執(zhí)行的命令草慧。
"scripts": {
"start": "node index.js"
},
//dependencies字段指定了項目運行所依賴的模塊
"dependencies": {
"express": "latest",
"mongoose": "~3.8.3",
"handlebars-runtime": "~1.0.12",
"express3-handlebars": "~0.5.0",
"MD5": "~1.2.0"
},
//devDependencies指定項目開發(fā)所需要的模塊。
"devDependencies": {
"bower": "~1.2.8",
"grunt": "~0.4.1",
"grunt-contrib-concat": "~0.3.0",
"grunt-contrib-jshint": "~0.7.2",
"grunt-contrib-uglify": "~0.2.7",
"grunt-contrib-clean": "~0.5.0",
"browserify": "2.36.1",
"grunt-browserify": "~1.3.0",
}
}
3. npm install --save app 與 npm install --save-dev app有什么區(qū)別?
當你為你的模塊安裝一個依賴模塊時匙头,正常情況下你得先安裝他們(在模塊根目錄下npm install module-name
)漫谷,然后連同版本號手動將他們添加到模塊配置文件package.json
中的依賴里(dependencies)。
--save
和--save-dev
可以省掉你手動修改package.json
文件的步驟蹂析。
npm install --save module-name
自動把模塊和版本號添加到dependencies
部分
npm install --save-dve module-name
自動把模塊和版本號添加到devdependencies
部分
dependencies
:生產(chǎn)依賴
devdependencies
:開發(fā)依賴
4.node_modules的查找路徑是怎樣的?
就近原則舔示,先在當前目錄下的node_modules下面找,如果沒找到电抚,逐級往上找惕稻,直到根目錄。
5.npm3與 npm2相比有什么改進蝙叛?yarn和 npm 相比有什么優(yōu)勢?
npm3相較于npm2而言優(yōu)化了依賴包的管理俺祠。解決了windows上npm包目錄太深的問題。
舉個例子:
假如我們寫了個模塊App,需要安裝兩個包A@1和C@1蜘渣,其中A@1依賴另一個包B@1淌铐,C@1依賴B@2,用npm2和npm3安裝之后的依賴圖分別是這樣的
npm3按照安裝順序存放依賴模塊蔫缸,先安裝A@1腿准,發(fā)現(xiàn)依賴模塊B@1沒有安裝過也沒有其他版本的B模塊沖突,所以B@1存放在第一級目錄捂龄,B@2為了避免和B@1的沖突释涛,還是繼續(xù)放在C@1之下加叁。
npm2沒什么好說的倦沧,來什么安裝什么,根本不用理會公共依賴關系它匕,依賴模塊一層一層往下存放就是了展融,下面重點講解npm3在這方面的改進。
現(xiàn)在App又需要安裝一個包D@1豫柬,D@1依賴B@2告希,使用npm3安裝之后,包結(jié)構(gòu)將變成下面這樣
雖然C@1和D@1都依賴B@2烧给,但是由于A@1先安裝燕偶,A@1依賴的B@1已經(jīng)安裝到第一級目錄了,后續(xù)需要安裝的所有包B础嫡,只要版本不是1指么,都需要避免和B@1的沖突,所以只能像npm2一樣榴鼎,安裝在相應包下面伯诬。
接著又安裝了一個E@1,依賴B@1巫财,因為B@1已經(jīng)安裝過盗似,且不會有版本沖突,這時候就不用重復安裝B@1了平项,包結(jié)構(gòu)會變成這樣
隨著App升級了赫舒,需要把A@1升級到A@2,而A@2依賴B@2闽瓢,把E@1升級到E@2接癌,E@2也依賴B@2,那么B@1將不會再被誰依賴鸳粉,npm將卸載B@1扔涧,新的包結(jié)構(gòu)將變成這樣
可以看到出現(xiàn)了冗余,結(jié)果跟預期的不一樣枯夜,既然所有對B的依賴都是B@2弯汰,那么只安裝一次就夠了湖雹。
npm dedupe
npm在安裝包的時候沒有這么“智能”,不過npm dedupe命令做的事就是重新計算依賴關系摔吏,然后將包結(jié)構(gòu)整理得更合理鸽嫂。
執(zhí)行一遍npm dedupe將得到
yarn和 npm 相比有什么優(yōu)勢?
Yarn 有一個鎖定文件 (lock file) 記錄了被確切安裝上的模塊的版本號征讲。每次只要新增了一個模塊,Yarn 就會創(chuàng)建(或更新)yarn.lock 這個文件诗箍。這么做就保證了癣籽,每一次拉取同一個項目依賴時,使用的都是一樣的模塊版本
Yarn在拉取包的時候滤祖,是采用了并行安裝筷狼,所以相較于npm的列隊安裝的速度會快很多匠童。
6. webpack是什么?和其他同類型工具比有什么優(yōu)勢俏险?
webpack是一款模塊加載器兼打包工具首昔,它能把各種資源寡喝,例如JS(含JSX)勒奇、coffee、樣式(含less/sass)格二、圖片等都作為模塊來使用和處理竣蹦。
webpack的優(yōu)勢:
- webpack 是以 commonJS 的形式來書寫腳本,但對 AMD/CMD 的支持也很全面痘括,方便舊項目進行代碼遷移滔吠。
- 能被模塊化的不僅僅是 JS 了挠日。
- 開發(fā)便捷,能替代部分 grunt/gulp 的工作冬骚,比如打包懂算、壓縮混淆、圖片轉(zhuǎn)base64等计技。
- 擴展性強,插件機制完善住诸,特別是支持 React 熱插拔(見 react-hot-loader )的功能讓人眼前一亮涣澡。
7.npm script是什么丧诺?如何使用入桂?
就是npm的腳本語句呀驳阎,作用就是可以只寫一個指令,然后完成很多操作蜘腌。就好像游戲里面的定義宏饵隙,你按一個鍵,可以丟出一堆技能金矛。減少了很多操作。
首先你需要一個package.json
紅色框里的就是npm script
驶俊,我們先可以試試看。
在命令行中輸入 npm test
之后就自動執(zhí)行了寬中定義的內(nèi)容榕酒。
我們也可以自己自定義,當時只能定義npm規(guī)定的一些字符
但是不按照這些定義也可以澜掩,當時在運行的時候 需要
npm run 你定義的
8. 使用 webpack 替換 入門-任務15中模塊化使用的 requriejs
9.gulp是什么杖挣?使用 gulp 實現(xiàn)圖片壓縮、CSS 壓縮合并惩妇、JS 壓縮合并
gulp是基于流的自動化構(gòu)建工具∏锹瑁可以自動對css氓皱,js還有圖片進行壓縮。和npm script的概念是一樣的波材,用一個指令批量處理一堆事情,不過gulp可以做的要多很多唯灵。
** gulp 實現(xiàn)圖片壓縮**
第一步隙轻、在命令行輸入
npm install --save-dev gulp-imagemin
前提是要安裝了 gulp
第二步、創(chuàng)建 gulpfile.js 文件編寫代碼
// 獲取 gulp
var gulp = require('gulp')
// 獲取 gulp-imagemin 模塊
var imagemin = require('gulp-imagemin')
// 壓縮圖片任務
// 在命令行輸入 gulp images 啟動此任務
gulp.task('images', function() {
// 1. 找到圖片
gulp.src('images/*.*')
// 2. 壓縮圖片
.pipe(imagemin({
progressive: true
}))
// 3. 另存圖片
.pipe(gulp.dest('dist/images'))
});
// 在命令行使用 gulp auto 啟動此任務
gulp.task('auto', function() {
gulp.watch('images/*.*', ['images'])
})
// 使用 gulp.task('default') 定義默認任務
// 在命令行使用 gulp 啟動 images 任務和 auto 任務
gulp.task('default', ['images', 'auto'])
CSS 壓縮合并
第一步敛瓷、在命令行輸入
npm install gulp-minify-css
第二步斑匪、創(chuàng)建 gulpfile.js 文件編寫代碼
// 獲取 gulp
var gulp = require('gulp')
// 獲取 minify-css 模塊(用于壓縮 CSS)
var minifyCSS = require('gulp-minify-css')
// 壓縮 css 文件
// 在命令行使用 gulp css 啟動此任務
gulp.task('css', function () {
// 1. 找到文件
gulp.src('css/*.css')
// 2. 壓縮文件
.pipe(minifyCSS())
// 3. 另存為壓縮文件
.pipe(gulp.dest('dist/css'))
})
// 在命令行使用 gulp auto 啟動此任務
gulp.task('auto', function () {
// 監(jiān)聽文件修改,當文件被修改則執(zhí)行 css 任務
gulp.watch('css/*.css', ['css'])
});
// 使用 gulp.task('default') 定義默認任務
// 在命令行使用 gulp 啟動 css 任務和 auto 任務
gulp.task('default', ['css', 'auto'])
JS 壓縮合并
第一步绝淡、
npm install gulp-uglify
第二步苍姜、
// 獲取 gulp
var gulp = require('gulp')
// 獲取 uglify 模塊(用于壓縮 JS)
var uglify = require('gulp-uglify')
// 壓縮 js 文件
// 在命令行使用 gulp script 啟動此任務
gulp.task('script', function() {
// 1. 找到文件
gulp.src('js/*.js')
// 2. 壓縮文件
.pipe(uglify())
// 3. 另存壓縮后的文件
.pipe(gulp.dest('dist/js'))
})
// 在命令行使用 gulp auto 啟動此任務
gulp.task('auto', function () {
// 監(jiān)聽文件修改,當文件被修改則執(zhí)行 script 任務
gulp.watch('js/*.js', ['script'])
})
// 使用 gulp.task('default') 定義默認任務
// 在命令行使用 gulp 啟動 script 任務和 auto 任務
gulp.task('default', ['script', 'auto'])