Browserify讓你的Javascript游走于前后端

jopen 8年前發布 | 14K 次閱讀 JavaScript開發 Browserify

Browserify通過預編譯,可以讓前端以Nodejs的require方式來組織Javascript模塊,從而前端代碼可以走進后端,后端通過Browserify同樣可以在瀏覽器里跑NPM模塊;

在Nodejs中使用的是Commonjs中定義的模塊機制,每個Javascript文件就是一個模塊,模塊與文件之間是一一對應的關系;模塊通過exports來對外提供接口,包括屬性和方法,調用者使用require來加載模塊并使用模塊提供的接口;Browserify作為Nodejs與瀏覽器之間的橋梁,把Javascript擴展到Nodejs端,并改寫NPM模塊使瀏覽器也能使用數量眾多的NPM模塊,同時Browserify也很好的解決了模塊之間的依賴,可以很好的將應用模塊及依賴模塊打包成一個Javascript文件;

Nodejs對require參數(模塊名稱)解析規則:如果參數以'/'開頭,則模塊名表示絕對路徑;如果是以'./'開頭,則模塊名表示調用require方法的文件所在目錄的相對路徑;如果模塊名稱不以'/','./','../'開頭并且不是Nodejs自帶模塊,則表示你所安裝的模塊,即node_modules目錄下;所以你的應用所寫的模塊只要符合Nodejs模塊的規范,即可與NPM眾多模塊一起通過require的方式調用,然后由Browserify編譯打包生成你在瀏覽器里要調用的那個JS文件;

既然走到了Nodejs這里,前端自動化的工具自然少不了,這里推薦的是Gulp(基礎介紹: 前端自動化之神器 — Gulp ),后面介紹Browserify在Gulp里的基本做法;

1、Nodejs的模塊定義:

1 var Hello=function(){ console.log('Hello,Nodejs!'); } module.exports=Hello;

2、Nodejs的模塊調用:   

1 var Hello=require('./hello'); 
2 Hello();

3、Browserify編譯模塊:

首先安裝Browserify,npm install browserify -g

現在一個小栗子:把Nodejs模塊main.js編譯為瀏覽器可加載的Javascript文件index.js

1 browserify ./main.js > ./index.js
2 //或者
3 browserify ./main.js -o ./index.js

那么main.js里也一并打包了其所依賴的模塊,保證index.js在瀏覽器端的順利運行;

4、模塊的package.json:

在模塊所在根目錄添加package.json或npm init生成,可更方便的定義深層模塊的名:

1 {
2  'name':'mode',
3  'main':'./lib/mode/mode.min.js' 
4 }

main屬性指定了模塊的入口文件,這樣,通過require('./mode')來加載模塊時,會定位到目錄下的./lib/mode/mode.min.js;

5、package.json的browser屬性:

package.json里定義了模塊的相關配置信息,browserify擴展了package.json的配置項,通過browser屬性,可以指定瀏覽器環境中的模塊入口文件;這樣,模塊就可以在Nodejs和瀏覽器端自動切換入口文件了;Javascript可以自由游走于前后端了;

1 { 'name':'mode',
2  'main':'main.js',
3  'browser':'browser_main.js' 
4 }

在瀏覽器端指定要被替換的模塊:

1 { 
2      'name':'mode',
3      'main':'main.js',
4      'browser':{ 
5           'main.js':'browser_main.js' 
6       } 
7 }

在瀏覽器端指定要被忽略的模塊:

1 {
2     'name':'mode',
3     'main':'main.js',
4     'browser':{
5         'main.js':false 
6      } 
7 }

6、通過變換模塊brfs讀取靜態資源:

1 var fs = require('fs');
2 var html = fs.readFileSync(__dirname + '/example.html', 'utf8');

處理后的文件如下:

1 var fs = require('fs'); 
2 var html = "<p>hello,Nodejs!</p>";

還可以讀取css、base64圖片資源,在此就不弄了,可自行github;

7、獨立打包公共模塊:

比如:A模塊依賴a模塊和公共模塊c,B模塊依賴b模塊和公共模塊c,可將c模塊單獨打包;

1 browserify A.js B.js -p [ factor-bundle -o A.js -o B.js ] \ -o c.js

如此,依賴模塊會出現在打包后的文件內,而公共模塊不會出現在打包后的文件內;

8、在Gulpfile里使用browserify:

Gulp的安裝與基礎使用: 前端自動化之神器 — Gulp

還是先安裝要用到的插件:

1 var gulp=require('gulp'); 
2 var watch=require('gulp-watch'); 
3 var source = require("vinyl-source-stream");
4 var streamify=require('gulp-streamify'); 
5 var buffer=require('vinyl-buffer');

來個task:

1 gulp.task('browserify',function() { 
2        return browserify('./dist/react/testBroswerify.js')
3                   .bundle() .pipe(source('test.js'))                                                 
4                   .pipe(buffer())//.pipe(streamify(uglify())) //壓縮耗時間 上線處理 
5                   .pipe(gulp.dest('./dist/demos')) 
6 });

順便監聽下文件變動,實時編譯:

1 gulp.task('watch',function() { 
3        gulp.watch('./dist/react/testBroswerify.js',['browserify']); 
4 });

天色已晚,在此不做詳解了,根據項目情況,更多詳細任務配置還得由大家自己探索了;

9、前端加油

由于國情和實際項目的差異,可能基于PC端的前端開發還需要BSIE,但是Nodejs帶給前端的優秀模塊如云,以及前端的自動化進程、像Browserify這樣強大的工具,無疑對前端是歷史性的變革,用好工具,提高開發效率,大家加油!

來自: http://www.cnblogs.com/hufeng/p/5111959.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!