自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

使用node.js開發(fā)前端打包程序

開發(fā) 前端
我們在做前端開發(fā)的時候經(jīng)常會在部署上線的時候做程序的打包和合并,我們接下來就會對如何使用 node.js 開發(fā)前端打包程序做非常深入的講解,希望能夠幫到有需要的同學(xué)。

[[99704]]

我們在做前端開發(fā)的時候經(jīng)常會在部署上線的時候做程序的打包和合并,我們接下來就會對如何使用 node.js 開發(fā)前端打包程序做非常深入的講解,希望能夠幫到有需要的同學(xué)。

我們現(xiàn)在做前端開發(fā)更多的是多人共同協(xié)作開發(fā),每個人負(fù)責(zé)不同的模塊,便于開發(fā)和調(diào)試。這樣就導(dǎo)致我們***部署上線的時候需要把所有人開發(fā)的模塊進(jìn)行合并,生成單個或多個文件上線。如果手動合并的話肯定是費時又費力,而且非常容易出錯,所以我們一般都是通過一些工具來實現(xiàn)自動合并的功能。

打包程序的原理非常簡單,入口文件->尋找依賴關(guān)系->替換依賴關(guān)系->生成文件,其中中間的兩個步驟是遞歸執(zhí)行的。
我們先來看一下使用 node.js 如何完成一個簡單的文件合并功能:

  1. // 打包文件內(nèi)容  
  2. var contentList = [];  
  3. // 排重列表  
  4. var loadedFileList = {};  
  5.  
  6. // 打包主程序  
  7. function combine(filePath){  
  8.     // 這里獲取入口文件的內(nèi)容  
  9.     var fileContent = fs.readFileSync(filePath);  
  10.     // 遍歷文件內(nèi)容  
  11.     fileContent.forEach(function(value){  
  12.         // 這里的findImport是需要你來實現(xiàn)的方法,用正則來匹配依賴關(guān)系  
  13.         var matchFile = findImport(value);  
  14.         if(matchFile){  
  15.             //如果匹配到依賴關(guān)系  
  16.             If(!loadedFileList[matchFile]){  
  17.                 //如果依賴關(guān)系不在排重列表中,遞歸調(diào)用combine  
  18.                 combine(matchFile);  
  19.                 contentList.push(‘\n’);  
  20.             }  
  21.         }else{  
  22.             contentList.push(value);  
  23.         }  
  24.     });  

***只要根據(jù) contentList 里面的內(nèi)容來生成文件就可以了,怎么樣,是不是很簡單呢?下面我們就要介紹另外一種方式,使用流來完成我們的打包程序。

在 node.js 中,流(Stream)是一個由不同對象實現(xiàn)的抽象接口。流可以是可讀的、可寫的、或者既可讀又可寫的。所有的流都是 EventEmitter 的實例。我們可以通過繼承接口來構(gòu)造我們自己所需要的流。在我們的打包程序里面需要兩個流,一個負(fù)責(zé)按行輸出文件內(nèi)容,另外一個負(fù)責(zé)處理依賴關(guān)系。所有的文件內(nèi)容都在這兩個流里面循環(huán)流動,當(dāng)所有的依賴關(guān)系都處理完畢之后就結(jié)束流動并生成對應(yīng)的文件,這樣就達(dá)到我們的目的了。

讓我們先來看一下負(fù)責(zé)按行輸出文件內(nèi)容的流是怎么樣的:

  1. var Stream = require('stream').Stream,  
  2.     util = require('util'),  
  3.     path = require('path'),  
  4.     fs = require('fs');  
  5.  
  6. // 構(gòu)造函數(shù)  
  7. function LineStream() {  
  8.     this.writable = true;  
  9.     this.readable = true;  
  10.     this.buffer = '';  
  11. }  
  12.  
  13. module.exports = LineStream;  
  14. // 繼承流接口  
  15. util.inherits(LineStream, Stream);  
  16.  
  17. // 重寫write方法,所有pipe過來的數(shù)據(jù)都會調(diào)用此方法  
  18. LineStream.prototype.write = function(data, encoding) {  
  19.     var that = this;  
  20.     // 把buffer轉(zhuǎn)換為string類型  
  21.     if (Buffer.isBuffer(data)) {  
  22.         data = data.toString(encoding || 'utf8');  
  23.     }  
  24.  
  25.     var parts = data.split(/\n/g);  
  26.  
  27.     // 如果有上一次的buffer存在就添加到最前面  
  28.     if (this.buffer.length > 0) {  
  29.         parts[0] = this.buffer + parts[0];  
  30.     }  
  31.  
  32.     // 遍歷并發(fā)送數(shù)據(jù)  
  33.     for (var i = 0; i < parts.length - 1; i++) {  
  34.         this.emit('data', parts[i]);  
  35.     }  
  36.     // 把***一行數(shù)據(jù)保存到buffer,使傳遞過來的數(shù)據(jù)保持連續(xù)和完整。  
  37.     this.buffer = parts[parts.length - 1];  
  38. };  
  39. // end方法,在流結(jié)束時調(diào)用  
  40. LineStream.prototype.end = function() {  
  41.     // 如果還有buffer,發(fā)送出去  
  42.     if(this.buffer.length > 0){  
  43.         this.emit('data',this.buffer);  
  44.         this.buffer = '';  
  45.     }  
  46.     this.emit('end');  
  47. };  

這樣我們的 lineStream 就完成了,我們看到在 write 方法里面就做了一件事,分解傳遞過來的數(shù)據(jù)并按行發(fā)送出去,然后我們看下處理依賴關(guān)系的流 DepsStream。

  1. var stream = require('stream').Stream;  
  2. var util = require('util');  
  3. var fs = require('fs');  
  4. var path = require('path');  
  5.  
  6. module.exports = DepsStream;  
  7. util.inherits(DepsStream,stream);  
  8.  
  9. function DepsStream(){  
  10.     this.writable = true;  
  11.     this.readable = true;  
  12.     this.buffer = '';  
  13.     this.depsList = [];  
  14. };  
  15.  
  16. // 這里的write方法只發(fā)送數(shù)據(jù),不對數(shù)據(jù)做任何的處理  
  17. DepsStream.prototype.write = function(data){  
  18.     this.emit('data',data);  
  19. };  
  20.  
  21. // 我們在這里重新pipe方法,使其能夠處理依賴關(guān)系和生成最終文件  
  22. DepsStream.prototype.pipe = function(dest,opt){  
  23.     var that = this;  
  24.     function ondata(chunk){  
  25.         var matches = findImport(chunk);  
  26.         if(matches){  
  27.             if(this.depsList.indexOf(matches) >= 0){  
  28.                 // 我們在這里把處理過后的數(shù)據(jù)pipe回lineStream  
  29.                 dest.write('\n');  
  30.             }else{  
  31.                 this.depsList.push(matches);  
  32.                 var code = getFileContent(matches);  
  33.                 // 我們在這里把處理過后的數(shù)據(jù)pipe回lineStream  
  34.                 dest.write('\n' + code);  
  35.             }  
  36.         }else{  
  37.             this.buffer += chunk + '\n';  
  38.         }  
  39.     }  
  40.     function onend(){  
  41.         // 生成最終文件  
  42.         var code = this.buffer;  
  43.         fs.writeFileSync(filePublishUrl,code);  
  44.         console.log(filePublishUrl + ' combine done.');  
  45.     }  
  46.     // 監(jiān)聽end事件  
  47.     that.on('end',onend);  
  48.     // 監(jiān)聽data事件  
  49.     that.on('data',ondata);  
  50. };  
  51.  
  52. // end方法  
  53. DepsStream.prototype.end = function(){  
  54.     this.emit('end');  
  55. };  

我們看到上面的程序里面我們在 pipe 方法里面監(jiān)聽了 end 事件和 data 事件,ondata 方法主要用來對數(shù)據(jù)進(jìn)行處理,發(fā)現(xiàn)有依賴關(guān)系的話就獲取對應(yīng)依賴關(guān)系的文件并重新發(fā)回給 LineStream 進(jìn)行處理。onend 方法用來生成最終的文件,我們來看一下最終的調(diào)用方法:

  1. var fileStream = fs.createReadStream(filepath);  
  2. var lineStream = new LineStream();  
  3. var depsStream = new DepsStream();  
  4.  
  5. fileStream.pipe(lineStream);  
  6. lineStream.pipe(depsStream);  
  7. depsStream.pipe(lineStream); 

怎么樣,是不是非常簡單,感興趣的同學(xué)趕快嘗試一下吧。

原文鏈接:http://ued.sina.com/?p=983

責(zé)任編輯:林師授 來源: 新浪UED
相關(guān)推薦

2015-03-10 10:59:18

Node.js開發(fā)指南基礎(chǔ)介紹

2014-02-14 10:48:32

Visual StudNode.js

2013-05-17 09:41:02

Node.js云應(yīng)用開發(fā)IaaS

2021-01-14 10:48:34

Docker CompNode.js開發(fā)

2015-07-15 10:32:44

Node.js命令行程序

2022-08-28 16:30:34

Node.jsDocker指令

2023-01-10 14:11:26

2013-11-01 09:34:56

Node.js技術(shù)

2020-09-04 15:06:04

Docker容器化Node.js

2019-07-23 10:20:23

前端Node.js中間層

2011-12-16 10:08:36

Node.js

2019-05-05 11:47:09

TypeScript開發(fā)Node.js

2018-08-30 16:08:37

Node.js腳手架工具

2018-06-11 14:39:57

前端腳手架工具node.js

2011-10-24 16:16:02

Node.js

2021-05-05 11:36:31

Node前端自動化熱重載頁面

2021-03-03 06:39:05

Nodejs前端開發(fā)

2021-07-16 04:56:03

NodejsAddon

2020-07-31 13:35:34

Node.js應(yīng)用分析前端

2016-08-25 21:28:04

前端node截圖
點贊
收藏

51CTO技術(shù)棧公眾號