前端工程化-npm-gulp-webpack

題目1: 如何全局安裝一個(gè) node 應(yīng)用?

Node模塊采用npm install命令安裝撬讽。

每個(gè)模塊可以“全局安裝”,也可以“本地安裝”。“全局安裝”指的是將一個(gè)模塊安裝到系統(tǒng)目錄中茶宵,各個(gè)項(xiàng)目都可以調(diào)用。一般來說,全局安裝只適用于工具模塊乌庶,比如eslintgulp∑豕ⅲ“本地安裝”指的是將一個(gè)模塊下載到當(dāng)前項(xiàng)目的node_modules子目錄瞒大,然后只有在項(xiàng)目目錄之中,才能調(diào)用這個(gè)模塊搪桂。

# 本地安裝
 npm install <package name>

# 全局安裝
 npm install -g <package name>

# npm更新最新版本
cnpm install npm@lastest -g

如果下載速度比較慢透敌,可以使用淘寶的鏡像

//先執(zhí)行下面命令
npm install -g cnpm --registry=https://registry.npm.taobao.org

//以后安裝就用 cnpm 代替 npm
cnpm install -g xxx
install 可以縮寫成 i

題目2: package.json 有什么作用?

命令行npm init 可以初始化生成一個(gè)package.json

package.json 是一個(gè) json格式的文件踢械,用來記錄當(dāng)前的npm 包的相關(guān)信息酗电,如

name:包的名字
version:版本號
description:描述
main:包的入口文件
script: 運(yùn)行腳本命令的npm命令行縮寫
author: 作者
license: 版權(quán)信息
dependencies:項(xiàng)目運(yùn)行依賴,發(fā)布的時(shí)候内列,不需要發(fā)布依賴的包撵术,只要發(fā)布其名字,別人下載的時(shí)候话瞧,會自動下載依賴的包嫩与。
devDependencies:開發(fā)依賴,只有自己本地開發(fā)時(shí)候用的依賴包交排,發(fā)布以后別人不能用划滋。

{
"name": "packageName", 
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
  "test": "echo \"Error: no test specified\" && exit 1"
},
"author": "cg",
"license": "ISC",
"dependencies": {},
"devDependencies": {}
}

題目3: npm install --save app 與 npm install --save-dev app有什么區(qū)別?

命令行參數(shù)

當(dāng)你為你的模塊安裝一個(gè)依賴模塊時(shí),正常情況下你得先安裝他們埃篓,在模塊根目錄下npm install module-name处坪,然后連同版本號手動將他們添加到模塊配置文件package.json中的依賴?yán)?code>(dependencies)。

-savesave-dev可以省掉你手動修改package.json文件的步驟架专。

npm install module-name -save

自動把模塊和版本號添加到dependencies部分同窘。

npm install module-name -save-dev

自動把模塊和版本號添加到devdependencies部分。

配置文件

package.json提供了三種依賴關(guān)系定義:

  • dependencies
  • peerDependencies
  • devDependencies

devDependencies是開發(fā)時(shí)依賴胶征,比如你模塊用了mocha測試框架塞椎,那么你的模塊的開發(fā)就依賴mocha,如果別人想為你的模塊貢獻(xiàn)代碼睛低,他就需要安裝mocha案狠。但是只是使用你的模塊的人,就不需要mocha钱雷。

peerDependencies是為插件準(zhǔn)備的骂铁。比如grunt的插件,里面沒有require(“grunt”)罩抗,所以用dependencies會有問題拉庵。所以需要單獨(dú)列出。

題目4: node_modules的查找路徑是怎樣的?

  • 先從當(dāng)前目錄下查找node_modules文件夾套蒂,如果沒有钞支,則到父級文件夾查找node_modules文件夾茫蛹,直至查找到根目錄。

題目5: npm3與 npm2相比有什么改進(jìn)烁挟?yarn和 npm 相比有什么優(yōu)勢? (選做題目)

模塊和包

很多時(shí)候我們并不是很區(qū)分模塊和包婴洼,因?yàn)槲覀円话闶褂脠鼍熬褪?npm install xxx赌渣,然后在文件里直接require('xxx')靶溜。
但是考慮到很多時(shí)候我們也可以隨意 require 一個(gè)本地自己寫的 JS 文件,只要其按照CommonJS 規(guī)范 export即可搏予,因此這里需要嚴(yán)格區(qū)分下:

  • 模塊:符合 CommonJS 規(guī)范的文件
  • 包:一個(gè)包含 package.json以及入口文件的文件夾

這里也不是絕對這樣定義的且警,不過最終表現(xiàn)出來的就是這些粉捻,而 npm 的所有的管理的對象都必須包含 package.json 文件,用于模塊確定依賴關(guān)系斑芜。
說了這么多肩刃,只是為了強(qiáng)調(diào):npm是包管理器。

npm2 問題

npm2 安裝依賴的時(shí)候比較簡單直接押搪,直接按照包依賴的樹形結(jié)構(gòu)下載填充本地目錄結(jié)構(gòu)树酪。
因?yàn)?npm 設(shè)計(jì)的初衷就是考慮到了包依賴的版本錯(cuò)綜復(fù)雜的關(guān)系,同一個(gè)包因?yàn)楸灰蕾嚨年P(guān)系原因會出現(xiàn)多個(gè)版本大州,簡單地填充結(jié)構(gòu)保證了無論是安裝還是刪除都會有統(tǒng)一的行為和結(jié)構(gòu)续语。
比如一個(gè) App 里模塊 A 和 C 都依賴 B,無論被依賴的 B 是否是同一個(gè)版本厦画,都會生成對應(yīng)結(jié)構(gòu):



于是缺陷就凸顯出來了疮茄,太深的目錄樹結(jié)構(gòu)會嚴(yán)重影響效率,甚至在 Windows 下可能會超出系統(tǒng)路徑限制的長度根暑。另外力试,在 Windows 有刪 node_modules 目錄經(jīng)歷的可能都經(jīng)歷過漫長的等待。

npm3 解決方式

針對 npm2的問題排嫌,npm3加了點(diǎn)算法畸裳,直白的解釋就是:npm install
時(shí)會按照 package.json 里依賴的順序依次解析,遇到新的包就把它放在第一級目錄淳地,后面如果遇到一級目錄已經(jīng)存在的包怖糊,會先判斷版本,如果版本一樣則忽略颇象,否則會按照npm2 的方式依次掛在依賴包目錄下
還是剛剛的栗子伍伤,可以看下npm2npm3生成的結(jié)構(gòu)對比:


試想,在包版本差異化不太嚴(yán)重的情況下遣钳,這種構(gòu)建方式會幾乎把所有包放在一級目錄下扰魂,很大程度上提升了效率以及節(jié)省了部分磁盤空間。
其實(shí),npm3 這種方式在理論上其實(shí)會趨于一種平穩(wěn)的狀態(tài)劝评,因?yàn)槟憧赡軙f姐直,npm3 在極端情況下也可能退化為 npm2 的行為,不過這種情況在一般情況下是可以忽略的蒋畜。npm3 還有個(gè)優(yōu)點(diǎn)简肴,就是在動態(tài)安裝更新包的時(shí)候,是可以進(jìn)一步調(diào)整目錄結(jié)構(gòu)的百侧,比如某種依賴已經(jīng)如下:

具體依賴細(xì)節(jié)我們不用追究,假設(shè) E_v1.0 模塊是依賴 B_v1.0 的能扒,此時(shí)我們更新 E 到 v2.0佣渴,假設(shè)此時(shí)依賴 B_v2.0 了,那么最終生成的結(jié)構(gòu)會是如下:

是不是覺得很多冗余初斑?其實(shí)只需執(zhí)行下 npm dedupe
就會變成如下結(jié)構(gòu):

這已經(jīng)很接近我們理想的使用場景了辛润!

npm3 新的問題

你以為就這么完了嗎?注意到上面提到的npm3會按照package.json 的順序解析目錄樹见秤,試著看下下面的場景:


對應(yīng)的 dependencies為:

"dependencies": { "mod-a": "^1.0.0", "mod-c": "^1.0.0", "mod-d": "^1.0.0", "mod-e": "^1.0.0"}

如果恰好 A_v1.0 依賴 B_v1.0砂竖,然后我們本地升級了 A 到 v2.0,假設(shè)此時(shí)依賴 B_v2.0鹃答,那么此時(shí)目錄結(jié)構(gòu)會變成:


而此時(shí)部署到測試平臺呢乎澄?因?yàn)?mod-a 在第一個(gè),所以會優(yōu)先解析测摔,也就是 B_v2.0 會優(yōu)先占據(jù)一級目錄置济,最終可能目錄結(jié)構(gòu)為:

開發(fā)環(huán)境和測試環(huán)境的node_modules目錄結(jié)構(gòu)不一樣了!锋八!這個(gè)問題很可能會導(dǎo)致一些很微妙的問題浙于,而且很難調(diào)試。如何解決呢挟纱?就是本地每次安裝或者升級包后羞酗,完整刪除node_modules目錄然后再install一次……(感覺比npm2 還粗暴)

新的工具 yarn

除了上面的問題,還有個(gè)嚴(yán)重的問題紊服。npm 在使用的時(shí)候大多是用語義化版本號管理包依賴的檀轨,比如 ~1.0.0
表示只更新補(bǔ)丁,但是世界辣么大围苫,什么人沒有裤园?說不定哪個(gè)開發(fā)者就在 patch version 上就搞了major的升級,即使你本地使用固定版本號也無濟(jì)于事剂府。
當(dāng)然拧揽,后面 npm 也有 shrinkwrap 機(jī)制來保證這種一致性,不過說實(shí)話 npm-shrinkwrap.json 略難看,基本屬于給 npm 打補(bǔ)丁淤袜,讓我在一個(gè)項(xiàng)目引入這個(gè)幾乎無法 review 的文件肯定會不開心的痒谴。
太多因素導(dǎo)致了 npm 已經(jīng)步履維艱了,估計(jì) Facebook 也累了吧铡羡,于是前不久搞了yarn用來替代npm 了积蔚。
我覺得yarn革命性的更改在于其改變了構(gòu)建的步驟,其它有點(diǎn)都是新構(gòu)建方式的副產(chǎn)物烦周,yarn構(gòu)建步驟如下:

  • Resolution: 向倉庫請求依賴關(guān)系
  • Fetching: 看看本地緩存了沒有尽爆,否則把包拉到緩存里
  • Linking: 直接全部從緩存里構(gòu)建好目錄樹放到 node_modules 里

這里的緩存機(jī)制很像 mvn 之類的,而且其還引入了lockfile 用于鎖定版本號读慎,這很類似shrinkwrap漱贱,不過格式比npm-shrinkwrap.json 更好 review。除了這些特別明顯的改進(jìn)夭委,還有很多體驗(yàn)上的提升幅狮,具體可以看官方博客

題目6: webpack是什么株灸?和其他同類型工具比有什么優(yōu)勢崇摄?

WebPack可以看做是模塊打包機(jī):它做的事情是,分析你的項(xiàng)目結(jié)構(gòu)慌烧,找到JavaScript模塊以及其它的一些瀏覽器不能直接運(yùn)行的拓展語言(Scss逐抑,TypeScript等),并將其打包為合適的格式以供瀏覽器使用杏死。

WebPack和Grunt以及Gulp相比有什么特性

其實(shí) Webpack 和另外兩個(gè)并沒有太多的可比性泵肄,Gulp/Grunt 是一種能夠優(yōu)化前端的開發(fā)流程的工具,而WebPack 是一種模塊化的解決方案淑翼,不過Webpack 的優(yōu)點(diǎn)使得 Webpack 可以替代 Gulp/Grunt 類的工具腐巢。
GruntGulp 的工作方式是:在一個(gè)配置文件中,指明對某些文件進(jìn)行類似編譯玄括,組合冯丙,壓縮等任務(wù)的具體步驟,這個(gè)工具之后可以自動替你完成這些任務(wù)遭京。


** Grunt
Gulp** 的工作流程

Webpack的工作方式是:把你的項(xiàng)目當(dāng)做一個(gè)整體胃惜,通過一個(gè)給定的主文件(如:index.js),Webpack將從這個(gè)文件開始找到你的項(xiàng)目的所有依賴文件哪雕,使用loaders處理它們船殉,最后打包為一個(gè)瀏覽器可識別的JavaScript文件。

Webpack工作方式

如果實(shí)在要把二者進(jìn)行比較斯嚎,Webpack的處理速度更快更直接利虫,能打包更多不同類型的文件挨厚。

題目7:npm script是什么?如何使用糠惫?

npm允許在package.json文件里面疫剃,使用scripts字段定義腳本命令。

{
  // ...
  "scripts": {
    "build": "node build.js"
  }
}

上面代碼是package.json文件的一個(gè)片段硼讽,里面的scripts字段是一個(gè)對象巢价。它的每一個(gè)屬性,對應(yīng)一段腳本固阁。比如壤躲,build命令對應(yīng)的腳本是node build.js
命令行下使用npm run命令备燃,就可以執(zhí)行這段腳本柒爵。

$ npm run build

等同于執(zhí)行

$ node build.js

這些定義在package.json里面的腳本,就稱為 npm 腳本赚爵。它的優(yōu)點(diǎn)很多。

  • 項(xiàng)目的相關(guān)腳本法瑟,可以集中在一個(gè)地方冀膝。
  • 不同項(xiàng)目的腳本命令,只要功能相同霎挟,就可以有同樣的對外接口窝剖。用戶不需要知道怎么測試你的項(xiàng)目,只要運(yùn)行npm run test即可酥夭。
  • 可以利用 npm 提供的很多輔助功能赐纱。

查看當(dāng)前項(xiàng)目的所有 npm 腳本命令,可以使用不帶任何參數(shù)的npm run命令熬北。

$ npm run

題目8: 使用 webpack 替換 入門-任務(wù)15中模塊化使用的 requriejs

github代碼

題目9:gulp是什么疙描?使用 gulp 實(shí)現(xiàn)圖片壓縮、CSS 壓縮合并讶隐、JS 壓縮合并

簡介:

gulp 是前端開發(fā)過程中對代碼進(jìn)行構(gòu)建的工具起胰,是自動化項(xiàng)目的構(gòu)建利器;她不僅能對網(wǎng)站資源進(jìn)行優(yōu)化巫延,而且在開發(fā)過程中很多重復(fù)的任務(wù)能夠使用正確的工具自動完成效五;使用她,我們不僅可以很愉快的編寫代碼炉峰,而且大大提高我們的工作效率畏妖。

gulp中文網(wǎng)

入門指南

  1. 全局安裝 gulp:
$ npm install --global gulp
  1. 作為項(xiàng)目的開發(fā)依賴(devDependencies)安裝:
$ npm install --save-dev gulp
  1. 在項(xiàng)目根目錄下創(chuàng)建一個(gè)名為 gulpfile.js 的文件:
var gulp = require('gulp');
gulp.task('default', function() {
  // 將你的默認(rèn)的任務(wù)代碼放在這
});
  1. 運(yùn)行 gulp:
$ gulp

默認(rèn)的名為 default 的任務(wù)(task)將會被運(yùn)行,在這里疼阔,這個(gè)任務(wù)并未做任何事情戒劫。

想要單獨(dú)執(zhí)行特定的任務(wù)(task)半夷,請輸入 gulp <task> <othertask>。

gulp的常用插件

var gulp=require('gulp');
var del=require('del');                         // 刪除文件
var minify=require('gulp-minify-css');           //壓縮CSS
var uglify=require('gulp-uglify');                // 壓縮JS
var concat=require('gulp-concat');               // 合并文件
var imagemin=require('gulp-imagemin');       // 縮小圖片


gulp.task('css', function() {
    gulp.src('css/*.css')
        .pipe(concat('merge.css'))
        .pipe(minify())
        .pipe(gulp.dest('dist2/css'));
})

gulp.task('js', function() {
    gulp.src('js/**/*.js')
        .pipe(concat('merge.js'))
        .pipe(uglify())
        .pipe(gulp.dest('dist2/js'));
})

gulp.task('pic', function() {
    gulp.src('images/*')
        .pipe(imagemin())
        .pipe(gulp.dest('dist2/images'));
})

gulp.task('clean', function() {
    del([
       'dist2'
    ])
 })

gulp.task('default',['css','js','pic'])
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谱仪,一起剝皮案震驚了整個(gè)濱河市玻熙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌疯攒,老刑警劉巖嗦随,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異敬尺,居然都是意外死亡枚尼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門砂吞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來署恍,“玉大人,你說我怎么就攤上這事蜻直《⒅剩” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵概而,是天一觀的道長呼巷。 經(jīng)常有香客問我,道長赎瑰,這世上最難降的妖魔是什么王悍? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮餐曼,結(jié)果婚禮上压储,老公的妹妹穿的比我還像新娘。我一直安慰自己源譬,他們只是感情好集惋,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著踩娘,像睡著了一般芋膘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上霸饲,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天为朋,我揣著相機(jī)與錄音,去河邊找鬼厚脉。 笑死习寸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的傻工。 我是一名探鬼主播霞溪,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼孵滞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鸯匹?” 一聲冷哼從身側(cè)響起坊饶,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎殴蓬,沒想到半個(gè)月后匿级,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡染厅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年痘绎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肖粮。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡孤页,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出涩馆,到底是詐尸還是另有隱情行施,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布魂那,位于F島的核電站悲龟,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏冰寻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一皿渗、第九天 我趴在偏房一處隱蔽的房頂上張望斩芭。 院中可真熱鬧,春花似錦乐疆、人聲如沸划乖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽琴庵。三九已至,卻和暖如春仰美,著一層夾襖步出監(jiān)牢的瞬間迷殿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工咖杂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留庆寺,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓诉字,卻偏偏與公主長得像懦尝,于是被迫代替她去往敵國和親知纷。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 題目1: 如何全局安裝一個(gè) node 應(yīng)用? 如果下載速度比較慢陵霉,可以使用淘寶的鏡像 install 可以縮寫成 ...
    輝夜乀閱讀 413評論 0 0
  • 在現(xiàn)在的前端開發(fā)中琅轧,前后端分離、模塊化開發(fā)踊挠、版本控制乍桂、文件合并與壓縮、mock數(shù)據(jù)等等一些原本后端的思想開始...
    Charlot閱讀 5,431評論 1 32
  • 最近在學(xué)習(xí) Webpack,網(wǎng)上大多數(shù)入門教程都是基于 Webpack 1.x 版本的,我學(xué)習(xí) Webpack 的...
    My_Oh_My閱讀 8,166評論 40 247
  • 1: 如何全局安裝一個(gè) node 應(yīng)用? 全局安裝:package會被下載到到特定的系統(tǒng)目錄下( /usr/loc...
    yuhuan121閱讀 388評論 0 0
  • 公開課后感想 周三是我講公開課止毕,開始以為就是本組的老師聽一下模蜡,把學(xué)生自主學(xué)習(xí)的方法推廣下就行了,所以重點(diǎn)就放在了整...
    巴珍閱讀 98評論 0 0