成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

使用node.js開發前端打包程序

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

[[99704]]

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

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

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

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

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

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

讓我們先來看一下負責按行輸出文件內容的流是怎么樣的:

  1. var Stream = require('stream').Stream,  
  2.     util = require('util'),  
  3.     path = require('path'),  
  4.     fs = require('fs');  
  5.  
  6. // 構造函數  
  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過來的數據都會調用此方法  
  18. LineStream.prototype.write = function(data, encoding) {  
  19.     var that = this;  
  20.     // 把buffer轉換為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.     // 遍歷并發送數據  
  33.     for (var i = 0; i < parts.length - 1; i++) {  
  34.         this.emit('data', parts[i]);  
  35.     }  
  36.     // 把***一行數據保存到buffer,使傳遞過來的數據保持連續和完整。  
  37.     this.buffer = parts[parts.length - 1];  
  38. };  
  39. // end方法,在流結束時調用  
  40. LineStream.prototype.end = function() {  
  41.     // 如果還有buffer,發送出去  
  42.     if(this.buffer.length > 0){  
  43.         this.emit('data',this.buffer);  
  44.         this.buffer = '';  
  45.     }  
  46.     this.emit('end');  
  47. };  

這樣我們的 lineStream 就完成了,我們看到在 write 方法里面就做了一件事,分解傳遞過來的數據并按行發送出去,然后我們看下處理依賴關系的流 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方法只發送數據,不對數據做任何的處理  
  17. DepsStream.prototype.write = function(data){  
  18.     this.emit('data',data);  
  19. };  
  20.  
  21. // 我們在這里重新pipe方法,使其能夠處理依賴關系和生成最終文件  
  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.                 // 我們在這里把處理過后的數據pipe回lineStream  
  29.                 dest.write('\n');  
  30.             }else{  
  31.                 this.depsList.push(matches);  
  32.                 var code = getFileContent(matches);  
  33.                 // 我們在這里把處理過后的數據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.     // 監聽end事件  
  47.     that.on('end',onend);  
  48.     // 監聽data事件  
  49.     that.on('data',ondata);  
  50. };  
  51.  
  52. // end方法  
  53. DepsStream.prototype.end = function(){  
  54.     this.emit('end');  
  55. };  

我們看到上面的程序里面我們在 pipe 方法里面監聽了 end 事件和 data 事件,ondata 方法主要用來對數據進行處理,發現有依賴關系的話就獲取對應依賴關系的文件并重新發回給 LineStream 進行處理。onend 方法用來生成最終的文件,我們來看一下最終的調用方法:

  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); 

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

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

責任編輯:林師授 來源: 新浪UED
相關推薦

2015-03-10 10:59:18

Node.js開發指南基礎介紹

2013-05-17 09:41:02

Node.js云應用開發IaaS

2014-02-14 10:48:32

Visual StudNode.js

2021-01-14 10:48:34

Docker CompNode.js開發

2015-07-15 10:32:44

Node.js命令行程序

2022-08-28 16:30:34

Node.jsDocker指令

2013-11-01 09:34:56

Node.js技術

2023-01-10 14:11:26

2020-09-04 15:06:04

Docker容器化Node.js

2019-07-23 10:20:23

前端Node.js中間層

2018-06-11 14:39:57

前端腳手架工具node.js

2011-10-24 16:16:02

Node.js

2018-08-30 16:08:37

Node.js腳手架工具

2011-12-16 10:08:36

Node.js

2019-05-05 11:47:09

TypeScript開發Node.js

2022-08-22 07:26:32

Node.js微服務架構

2021-07-30 11:20:53

JavaScriptNode.jsWeb Develop

2016-08-25 21:28:04

前端node截圖

2020-07-31 13:35:34

Node.js應用分析前端

2020-10-15 14:33:18

Node.js中國程序員
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99视频免费在线观看 | 欧美日韩在线精品 | 波多野结衣在线观看一区二区三区 | 一区二区三区电影在线观看 | 一级网站 | 亚洲欧美一区二区三区国产精品 | 精品一区二区三区在线观看 | 精品亚洲一区二区三区四区五区 | 在线观看国产 | 亚洲免费在线观看 | 国产xxxx岁13xxxxhd | 激情视频网站 | 亚洲免费在线 | 午夜久久久 | 久草在线影 | 麻豆av一区二区三区久久 | 欧美精品一区二区三区视频 | 国产精品一区二区三区免费观看 | 亚洲精品欧美 | 91av在线视频观看 | 一本一道久久a久久精品综合蜜臀 | 国产第一页在线播放 | 桃花av在线| 一级a爱片性色毛片免费 | 午夜国产精品视频 | 久久久精品一区 | 久久青| 日本精品一区二区三区视频 | 日韩欧美亚洲 | 韩国av网站在线观看 | 国产精品久久久爽爽爽麻豆色哟哟 | 黄免费看 | 欧美精品一区二区三区四区 在线 | 99九九视频 | 午夜欧美a级理论片915影院 | 欧美成人精品一区二区三区 | 国产日韩欧美在线 | 99视频网 | 精产国产伦理一二三区 | 国产精品久久久久久久久久99 | 欧美久久久|