模塊加載器:npm · webpack · gulp

刀脏、將代碼模塊化之后,我們需要模塊加載器來管理這些模塊

**npm

*解析
node package managernode包管理器是基于couchdb的一個數(shù)據(jù)庫超凳,
詳細記錄了每個包的信息愈污,包括作者、版本轮傍、依賴暂雹、授權(quán)信息等。

*作用
管理node包pakeage创夜,包括:安裝杭跪、卸載、更新驰吓、查看涧尿、搜索、發(fā)布等檬贰。
將開發(fā)者從繁瑣的包管理工作中解放出來姑廉,更加專注于功能的開發(fā)。
類似App Store 翁涤、豌豆莢桥言、360助手的用途

*使用
1 安裝Node同時獲贈npm
2 在GitBush里通過命令行操作
npm -v 查看npm版本號
sudo npm install npm -g 更新npm版本

3 下載package
npm install xxxx 本地安裝 ● 存放在當(dāng)前node_modules文件夾 ● 只能在當(dāng)前目錄下使用,通過require調(diào)用
npm install -g xxxx 全局安裝 ● 存放在指定系統(tǒng)文件夾/usr/local/lib/node_modules ● 供命令行(command line)使用的迷雪,比如grunt限书,無法require ● 可能會有權(quán)限限制=> sodu...... 管理員身份 ● 可能比較慢=> cnpm...... 國內(nèi)鏡像地址
npm uninstall xxxx 卸載

**4 發(fā)布package **
npm init 在當(dāng)前目錄下生成配置文件 package.json

■ package.json
· □ 解析: 以key&vaule的形式列出一個清單 □ 作用: 配置pkg的基本信息;指導(dǎo)npm如何安裝這個pkg □ 重要屬性: bin 可執(zhí)行文件目錄 => 設(shè)置全局快捷鍵(寫入path命令) scripts 定義一些操作方式 => 設(shè)置本地快捷鍵 dependencies 運行pkg功能時的依賴包 => 產(chǎn)品模式 devDependencies 開發(fā)pkg時的依賴包(測試用)=> 開發(fā)模式

npm install --save xxxx 安裝的同時章咧,在配置信息dependencies上保存這個 運行依賴包的信息
npm install --save-dev kkkk 安裝的同時,在配置信息devDependencies上保存這個 開發(fā)依賴包的信息

■ 有了package.json文件: □ 直接 npm install 就可以安裝所有的(運行+開發(fā))依賴包到node_modules中 □ 所以提交代碼時能真,也不用提交node_modules這個文件夾了 □ 執(zhí)行 npm install --production 即選擇產(chǎn)品模式赁严,就只安裝dependencies里的依賴包了

■ scripts 在本地使用node時: □ 執(zhí)行scripts里的key值扰柠,就運行vaule里的命令; 即 通過key值配置命令,通過vaule值配置命令代碼 □ npm key key值是npm規(guī)定范圍內(nèi)的單詞疼约,直接運行 ; □ npm run key key值不是npm規(guī)定范圍內(nèi)的詞卤档,要加run才可以運行

■ bin在全局使用node時: □ 全局安裝時,pkg被放入指定系統(tǒng)文件夾/usr/local/lib/node_modules程剥, 同時在/usr/local/bin下創(chuàng)建一個快捷方式劝枣,指向/usr/local/lib/node_modules 此時pkg就是一個命令行工具了 => □ 輸入bin信息的 key值 就運行vaule里指向的文件 即 通過key值配置全局命令,通過vaule值配置命令文件的地址 □ 這個屬性和本地沒關(guān)系织鲸!用不上舔腾!

■ node_modules 查找模塊時: □ requeire() 有三種形式: 絕對路徑 / 相對路徑 / node封裝好的核心模塊(比如path) 如果是以上三種形式,就根據(jù)地址直接找 □ 如果不是以上三種形式搂擦,就在上一級目錄遞歸查找 node_modules目錄 □ 如果查找玩所有的module.path數(shù)組還沒有稳诚,就報錯

■ 總結(jié)一下,如何發(fā)布一個包:
0 注冊npm 得到ID
1 npm init 創(chuàng)建package.json瀑踢,配置pkg信息? 加入github地址
2 npm install --save安裝依賴包扳还,并計入pkg信息
3 bin.js新建可執(zhí)行文件,require(./index) =>指向主文件 :(可以理解為創(chuàng)建快捷方式 吧
4 index.js新建主程序文件橱夭,require(xxxx) 使用依賴包氨距,編譯代碼
5 npm login登錄npm
6 npm publish發(fā)布pkg

*版本區(qū)別
npm2 :以pkg依賴來安裝,純粹的不共享包原則=>重復(fù)安裝
npm3 :以pkg字母序安裝棘劣,優(yōu)先安裝在第一層級目錄=> 避免重復(fù)安裝
yarn versus npm :互聯(lián)網(wǎng)巨頭對npm進行優(yōu)化后得到的一個包管理器衔蹲,改善了npm一些版本管理混亂;重復(fù)下載呈础;下載速度慢等問題舆驶。

*webpack

module building system
雖然npm完成了js模塊管理,
但是前端代碼還需要處理類似CSS而钞、png沙廉、webfonts等非JS的文件。
所以我們需要一個既能處理JS又能處理別的資源文件的加載器 臼节。

*解析
webpack 是一個前端資源模塊化管理和打包工具撬陵。
webpack不關(guān)心模塊內(nèi)容、文件格式网缝,所有文件都是模塊,只是處理的方式不同巨税;
它只是按 配置文件中規(guī)定的方式來處理相應(yīng)模塊。

*作用
它可以將許多松散的模塊按照依賴和規(guī)則打包成符合生產(chǎn)環(huán)境部署的前端資源粉臊。
還可以將按需加載的模塊進行代碼分隔草添,等到實際需要的時候再異步加載。

*優(yōu)點
1模塊不一定要遵守 CMD 或 AMD 等規(guī)范
2只打包真正被依賴的資源扼仲,按需加載
3可以深度定制打包方案

*配置文件
webpack.config.js □ 解析: 以module.exports對象作為一個出口 以key&vaule的形式列出一個清單 □ 作用: 構(gòu)建一個兼容本地開發(fā)和生產(chǎn)環(huán)境的富應(yīng)用web工程远寸。 □ 重要屬性: entry 定義整個編譯過程的起點 output 定義整個編譯過程的終點 module 定義模塊module的處理方式 plugin 對編譯完成后的內(nèi)容進行二度加工 resolve.alias 定義模塊的別名

*使用過程
1 使用npm安裝webpack
2 寫好配置文件webpack.config
3 寫好主文件main.js
4 執(zhí)行webpack生成 編譯后的主文件

舉例            
webpack-demo         目標(biāo)目錄
  ?index.html            網(wǎng)頁                     
  ?webpack.config.js     webpack配置文件
  ?webpack_JS            webpack目錄
    ▼dist                   輸出目錄
      ?main.js                 編譯后的主文件
    ? module1.js            模塊1
    ? module2.js            模塊2
    ? main.js               引用了模塊的主程序文件

**gulp

*解析
○ 基于Nodejs的一個自動化抄淑、批量化地處理重復(fù)性工作的自動任務(wù)運行器。
○ 與webpack側(cè)重于模塊打包不同驰后,gulp側(cè)重于流程管理肆资。
○ 借鑒了Unix操作系統(tǒng)的管道(pipe)思想,前一級的輸出灶芝,直接變成后一級的輸入 ..使得在操作上非常簡單郑原。

*作用
自動化地完成 javascript/coffee/sass/less/html/image/css等文件的
測試 => 檢查 => 合并 => 壓縮 => 格式化 => 瀏覽器自動刷新 => 部署文件生成
并監(jiān)聽文件在改動后重復(fù)指定的這些步驟。

*使用過程
1 npm install gulp-cli -g全局安裝gulp(無法require)
2 npm init生成package.json
3 npm install --save-dev xx 本地安裝gulp 并寫入開發(fā)依賴
4 npm install --save-dev kk本地安裝gulp插件
5 新建 gulpfile.js 使用插件編譯代碼
6運行任務(wù)`

gulp API
      gulp.src   引入需要處理的文件
      gulp.dest  導(dǎo)出處理好的文件
      gulp.task  定義一個任務(wù)
      guip.watch 監(jiān)聽任務(wù)變化
demo
    ■ 圖片壓縮
     □ 安裝插件
       npm install --save gulp-imagemin  

     □ 使用插件
       gulpfile.js 
         var gulp = require('gulp');
         var imagemin = require('gulp-imagemin');     引入插件
         gulp.task('img', function(argument){         定義一個test任務(wù)
             gulp.src('src/imgs/*.img')               處理所有.img后綴的文件
                 .pipe(imagemin())                    任務(wù)調(diào)用的模塊
                 .pipe(gulp.dest('dist/imgs'));       處理之后的文件 
         });


    ■ CSS 壓縮合并:
     □ 安裝插件
         $ npm install --save gulp-minify-css
         $ npm install --save gulp-rename
         $ npm install --save gulp-concat

     □ 使用插件
       gulpfile.js
         var gulp = require('gulp');
         var concat = require('gulp-concat');
         var minifycss = require('gulp-minify-css');
         var rename = require('gulp-rename');
         gulp.task('css', function(argument) {
             gulp.src('src/css/*.css')
                 .pipe(concat('merge.css'))
                 .pipe(rename({
                     suffix: '.min'
                 }))
                 .pipe(minifycss())
                 .pipe(gulp.dest('dist/css/'));
         });


    ■ JS 壓縮合并:
     □ 安裝插件
         $ npm install --save gulp-uglify
         $ npm install --save gulp-concat
         $ npm install --save gulp-rename

     □ 使用插件
       gulpfile.js
         var gulp = require('gulp');
         var concat = require('gulp-concat');
         var uglify = require('gulp-uglify');
         var rename = require('gulp-rename');
         gulp.task('js', function(argument) {
             gulp.src('src/js/*.js')
                 .pipe(concat('merge.js'))
                 .pipe(rename({
                     suffix: '.min'
                 }))
                 .pipe(uglify())
                 .pipe(gulp.dest('dist/js/'));
         });

參考資料
Linux 命令大全
webpack技術(shù)講解及入門

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末夜涕,一起剝皮案震驚了整個濱河市犯犁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌钠乏,老刑警劉巖栖秕,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異晓避,居然都是意外死亡簇捍,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門俏拱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來暑塑,“玉大人,你說我怎么就攤上這事锅必∈赂瘢” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵搞隐,是天一觀的道長驹愚。 經(jīng)常有香客問我,道長劣纲,這世上最難降的妖魔是什么逢捺? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮癞季,結(jié)果婚禮上劫瞳,老公的妹妹穿的比我還像新娘。我一直安慰自己绷柒,他們只是感情好志于,可當(dāng)我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著废睦,像睡著了一般伺绽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天憔恳,我揣著相機與錄音瓤荔,去河邊找鬼净蚤。 笑死钥组,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的今瀑。 我是一名探鬼主播程梦,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼橘荠!你這毒婦竟也來了屿附?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤哥童,失蹤者是張志新(化名)和其女友劉穎挺份,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贮懈,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡匀泊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了朵你。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片各聘。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖抡医,靈堂內(nèi)的尸體忽然破棺而出躲因,到底是詐尸還是另有隱情,我是刑警寧澤忌傻,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布大脉,位于F島的核電站,受9級特大地震影響水孩,放射性物質(zhì)發(fā)生泄漏镰矿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一荷愕、第九天 我趴在偏房一處隱蔽的房頂上張望衡怀。 院中可真熱鬧,春花似錦安疗、人聲如沸抛杨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怖现。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間屈嗤,已是汗流浹背潘拨。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留饶号,地道東北人铁追。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像茫船,于是被迫代替她去往敵國和親琅束。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,440評論 2 359

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

  • 無意中看到zhangwnag大佬分享的webpack教程感覺受益匪淺算谈,特此分享以備自己日后查看涩禀,也希望更多的人看到...
    小小字符閱讀 8,178評論 7 35
  • 什么是 NPM npm之于Node,就像pip之于Python,gem之于Ruby,composer之于PHP然眼。 ...
    ihoey閱讀 6,252評論 2 36
  • 前言 眾所周知目前比較火的工具就是gulp和webpack艾船,但webpack和gulp卻有所不同,本人兩者的底層研...
    cduyzh閱讀 1,369評論 0 13
  • 題目1: 如何全局安裝一個 node 應(yīng)用? “全局安裝”指的是將一個模塊安裝到系統(tǒng)目錄中高每,各個項目都可以調(diào)用屿岂。一...
    saintkl閱讀 295評論 0 0
  • 前些日子看到一個帖子,心血來潮地就對爸媽說觉义,想吃毛華玉蘭餅了雁社。 那一種味道叫熟悉。 熟悉的另一面叫陌生晒骇,比如今早被...
    ce2c4243cb2c閱讀 256評論 0 1