Vue.jsbrowserify項目模板


Vue.js——60分鍾browserify項目模板快速入門

 

概述

在之前的一系列vue.js文章,我們都是用傳統模式引用vue.js以及其他的js文件的,這在開發時會產生一些問題。

首先,這限定了我們的開發模式是基於頁面的,而不是基於組件的,組件的所有代碼都直接寫在頁面中,這對於一些復雜的頁面來說,不是好事情,代碼的可讀性會較差,也不便於管理。

其次,定義在HTML頁面中的組件,無法被其他頁面重用,我們只能通過復制粘貼的方式將組件代碼拷貝到其他頁面,這也違反了DRY原則。既然組件是Vue.js的重要概念,我們就應該利用好它。

為了解決這些問題,Vue.js官方提供了一些開發模板,這使得我們能夠快速地配置好vue.js的開發環境。基於這些開發模板,將使用.vue文件定義組件,使組件代碼從HTML頁面代碼中分離出來。在定義組件時,使用一些ES2015的便捷語法,將會使組件開發變得更加輕松。

Vue.js官方提供了兩種類型的模板項目:

  • 基於vue cli和browserify的項目模板
  • 基於vue cli和webpack的項目模板

vue cli是Vue.js官方提供的命令行創建Vue.js項目腳手架的工具。這兩種類型的項目模板分別提供了簡單模式和完全模式,簡單模式僅包含基於vue.js開發必要的一些資源和包,使用該模式可以快速地投入到開發。完全模式則還包括ESLink、單元測試等功能。

今天我們首先介紹基於vue cli和browserify的項目模板。

本文的Demo和源代碼已放到GitHub,如果您覺得內容不錯,請點個贊,或在GitHub上加個星星!

browserify介紹

image

Browsers don't have the require method defined, but Node.js does. With Browserify you can write code that uses require in the same way that you would use it in Node.

Browserify是一個CommonJS風格的模塊及依賴管理工具,它不僅是一個打包工具,更關鍵的是其JavaScript的模塊及依賴管理能力。

Browserify參照了Node中的模塊系統,約定用require()來引入其他模塊,用module.exports來引出模塊。在我看來,Browserify不同於RequireJS和Sea.js的地方在於,它沒有着力去提供一個“運行時”的模塊加載器,而是強調進行預編譯。預編譯會帶來一個額外的過程,但對應的,你也不再需要遵循一定規則去加一層包裹。因此,相比較而言,Browserify提供的組織方式更簡潔,也更符合CommonJS規范。

Browserify主頁:http://browserify.org/

vueify介紹

所謂vueify,就是使用.vue格式的文件定義組件,一個.vue文件就是一個組件。

在.vue文件定義的組件內容包括3部分:

  • <style></style>標簽:定義組件樣式
  • <template></template>標簽:定義組件模板
  • <script></script>標簽:定義組件的各種選項,比如data, methods等。

vue.js已經擁抱ES6了,使用.vue文件定義組件時,需要使用ES6的一些語法,ES6提供了一些較為優秀的特性,這使得定義組件的代碼變得更加簡潔。

以下app.vue文件定義了一個組件:

// app.vue
<style> .red { color: #f00; } </style> <template> <h1 class="red">{{msg}}</h1> </template> <script> export default { data () { return { msg: 'Hello world!' } } } </script>

你也可以在組件文件中使用預處理語言:

// app.vue
<style lang="stylus"> .red color #f00 </style> <template lang="jade"> h1(class="red") {{msg}} </template> <script lang="coffee"> module.exports = data: -> msg: 'Hello world!' </script>

如果你不太熟悉預處理語言的語法,你可以使用第一種方式來定義組件。

vueify主頁:https://github.com/vuejs/vueify

安裝vue cli

vue cli是什么呢?官方的介紹如下:

A simple CLI for scaffolding Vue.js projects.

像Visual Studio這樣的工具,在創建項目時可以直接選擇Visual Studio內置的一些項目模板,例如:創建一個ASP.NET MVC或ASP.NET Web API項目。
Vue.js提供了的一系列項目模板,但它沒有Visual Studio這種可視化的工具。通過什么方式來使用項目模板呢?這就是vue cli要干的事兒。

安裝要求:安裝vue cli需要Node.js和Git,Node.js需要4.x版本以上。

我使用的是node 6.3.0版本:

image

執行以下命令安裝vue cli

npm install -g vue-cli

安裝完vue cli后,我們就可以在git bash窗口中使用命令創建Vue.js的項目了。

使用vue-browserify-simple模板

1.生成項目

右鍵運行Git Bash Here

image

在git bash下輸入以下命令:

vue init browserify-simple my-browserify-simple-demo

browserify-simple是項目模板的名稱,my-browserify-simple-demo是你要生成的項目名稱。

image

執行這個命令時,會有一些提示,一路按回車鍵。提示private (Y/n)時,根據需要輸入Y或n,這里我輸入了Y作為私有項目。

image

目錄下生成了一個文件夾my-browserify-simple-demo。

image

2. 項目結構說明

打開my-browserify-simple-demo文件夾,看到以下目錄結構:

image

打開index.html文件,注意它所引用的build.js文件並不存在,后面我會告訴你dist/build.js文件是如何生成的。

<!DOCTYPE html>
<html lang="en"> <head> <meta charset="utf-8"> <title>my-browserify-simple-demo</title> </head> <body> <app></app> <script src="dist/build.js"></script> </body> </html>

文件樹結構如下:

├─.babelrc	// babel配置文件
├─.gitignore	
├─index.html	// 主頁 ├─package.json // 項目配置文件 ├─README.md ├─dist // 發布目錄 │ ├─.gitkeep ├─src // 開發目錄 │ ├─App.vue // App.vue組件 │ ├─main.js // 預編譯入口

這里要特別說明兩個文件:package.json.babelrc文件。

package.json

有很多初學者看到package.json文件就會頭痛,這個文件到底是啥玩意兒,一堆看不懂的東西。

{
  "name": "my-browserify-simple-demo", "description": "A Vue.js project", "author": "keepfool <crmug@outlook.com>", "scripts": { "watchify": "watchify -vd -p browserify-hmr -e src/main.js -o dist/build.js", "serve": "http-server -c 1 -a localhost", "dev": "npm-run-all --parallel watchify serve", "build": "cross-env NODE_ENV=production browserify src/main.js | uglifyjs -c warnings=false -m > dist/build.js" }, "dependencies": { "vue": "^1.0.0" }, "devDependencies": { "babel-core": "^6.0.0", "babel-plugin-transform-runtime": "^6.0.0", "babel-preset-es2015": "^6.0.0", "babel-preset-stage-2": "^6.0.0", "babel-runtime": "^6.0.0", "cross-env": "^1.0.6", "babelify": "^7.2.0", "browserify": "^12.0.1", "browserify-hmr": "^0.3.1", "http-server": "^0.9.0", "npm-run-all": "^1.6.0", "uglify-js": "^2.5.0", "vueify": "^8.5.2", "watchify": "^3.4.0" }, "browserify": { "transform": [ "vueify", "babelify" ] } } 

package.json文件是項目配置文件,除了項目的一些基本信息外,有3個重要的節點我說明一下:

  • dependencies:項目發布時的依賴
  • devDependencies:項目開發時的依賴
  • scripts:編譯項目的一些命令

.babelrc文件

.babelrc文件定義了ES6的轉碼規則,基於ES6編寫的js代碼在編譯時都會被babel轉碼器轉換為ES5代碼。

{
  "presets": ["es2015", "stage-2"], "plugins": ["transform-runtime"] } 

為什么要將ES6轉換為ES5呢?因為我們將使用ES6的一些語法來編寫.vue組件,而有些瀏覽器目前還沒有全面支持ES6。

babel是一個非常有名的ES6轉碼器,babel主頁:https://babeljs.io/

3. 安裝依賴

執行以下命令安裝項目依賴:

cd my-browserify-simple-demo
npm install

安裝完成后,目錄下會產生一個node_modules文件夾。

image

項目相關的依賴都存放在這個文件夾下了。

image

4. 運行示例

執行以下命令運行示例:

npm run dev

image

在執行該命令后,dist目錄下會生成一個build.js文件。

image

打開127.0.0.1:8080,可以看到以下畫面:

image

注意:之前我使用的node是4.4.5的版本,執行這個命令會出現一個錯誤:cann't find module vue-hot-reload api..,我將node.js升級到6.3.0版本后,刪除node_modules文件夾,然后再次執行npm install命令重新安裝依賴以后,該問題就解決了。

5. 編譯過程說明

build.js文件是怎么產生的呢?我們把它分為兩種情況:

  • 開發時生成build.js
  • 發布時生成build.js

何為開發時和發布時?開發過.NET童鞋,可以簡單的理解為debug模式和release模式。

開發時成成build.js

在package.json文件的scripts節點下,有3行配置:

"scripts": {
  "watchify": "watchify -vd -p browserify-hmr -e src/main.js -o dist/build.js", "serve": "http-server -c 1 -a localhost", "dev": "npm-run-all --parallel watchify serve" }

npm run dev命令執行的是dev節點對應的命令npm-run-all --parallel watchify serve ,這行命令是依賴於watchify的,也就是下面這行命令:

watchify -vd -p browserify-hmr -e src/main.js -o dist/build.js

你不用糾結這行命令的每個參數是什么意思,只需要理解src/main.js –o dist/build.js的含義:

編譯src/main.js文件,然后輸出到dist/build.js

serve節點的命令http-server -c 1 -a localhost用於開啟http-server,http-server是一個簡易的web服務器。
下面這幅流程圖描述了這個編譯過程:

image

在git bash窗口執行npm run dev命令時,也能夠觀察到編譯過程。

image

watchify是什么東東呢?browserify的編譯是比較緩慢的,當一個browserify項目開始變大時,編譯打包的時間會變得較長。watchify是一個browserify的封裝,其在package.json中的配置和browserify是一樣的。它可以持續件監視文件的改動,並且只重新打包必要的文件。在一個大型的項目中使用watchify,第一次打包的時候可能還會花較長時間,但是后續的編譯打包將消耗較短的時間。

更多的watchify信息,請參考:https://github.com/substack/watchify/

發布時生成build.js

在理解了上述編譯過程后,發布時build.js就不難理解了。

"build": "cross-env NODE_ENV=production browserify src/main.js | uglifyjs -c warnings=false -m > dist/build.js"

執行npm run build命令可以生成發布時的build.js。

image

uglifyjs是基於nodejs的壓縮程序,用於壓縮HTML/CSS/JS,執行npm run build命令后生成的build.js就是經過壓縮的。

image

使用vue-browserify模板

simple-browserify模板用於構築基於browserify和vueify的開發環境,browserify模板則提供了更多內容:

  • 提供了ESLint:用於格式化JavaScript和檢查JavaScript代碼風格。
  • 提供了單元測試:使用PhantomJS with Karma + karma-jasmine + karma-browserify的單元測試, 支持ES2015和mock。

1.生成項目

重新打開一個git bash窗口,執行以下命令:

vue init browserify my-browserify-demo

browserify是項目模板,my-browserify-demo是項目名稱。

image

目錄下生成了一個文件夾my-browserify-demo:

image

文件目錄結構如下:

├─.babelrc		// babel配置文件
├─.eslintrc		// eslint配置文件 ├─.gitignore ├─index.html // 主頁 ├─karma.conf.js // karma配置文件 ├─package.json // 項目配置文件 ├─README.md ├─dist // 發布目錄 │ ├─.gitkeep ├─src // 開發目錄 │ ├─App.vue // App.vue組件 │ ├─main.js // 預編譯入口 │ ├─components // 組件目錄 │ ├──Hello.vue // Hello.vue組件 ├─test // 單元測試目錄 │ ├─unit │ ├──Hello.spec.js // Hello.vue單元測試

2. 安裝依賴

執行以下兩行命令,安裝項目依賴:

cd my-browserify-demo
npm install

image

(安裝過程較為緩慢,需要耐心等待…)

3. 運行示例

執行npm run dev命令啟動http-server。

image

在瀏覽器中輸入地址127.0.0.1:8080,可以看到以下畫面:

image

示例說明

注意main.js, App.vue和Hello.vue三者之間的關系。

main.js

import Vue from 'vue'
import App from './App.vue' /* eslint-disable no-new */ new Vue({ el: 'body', components: { App } }) 

import Vue from 'vue'這行代碼表示引入vue.js,在編譯時會從node_modules文件夾下尋找vue.js。

image

import App from './App.vue' 表示引入同目錄下的App.vue組件。

image

App.vue

<template> <div id="app"> <hello></hello> </div> </template> <script> import Hello from './components/Hello.vue' export default { components: { Hello } } </script> <style> body { font-family: Helvetica, sans-serif; } </style> 

import Hello from './components/Hello.vue' 表示引入components目錄下的Hello.vue組件。

Hello.vueApp.vue的子組件:

export default {
  components: {
    Hello
  }
}

Hello.vue

<template> <div class="hello"> <h1>{{ msg }}</h1> </div> </template> <script> export default { data () { return { // Note: modifying `msg` below will not cause changes to occur with // hot-reload. As reloaded components preserve their initial state, // modifying these values will have no effect. msg: 'Hello World!' } } } </script> 

Hello.vue組件沒有任何依賴,它僅僅輸出一段簡單的文字。

vue-browserify-simple示例

介紹完了這兩種模板,我們就來做個小示例吧,下面這個示例使用的是vue-browserify-simple模板。

├─.babelrc		// babel配置文件
├─.gitignore	
├─index.html		// 主頁 ├─package.json // 項目配置文件 ├─README.md ├─dist // 發布目錄 │ ├─.gitkeep ├─src // 開發目錄 │ ├─App.vue // App.vue組件 │ ├─main.js // 預編譯入口 │ ├─components // 組件目錄 │ ├──SimpeGrid.vue // SimpleGrid.vue組件 │ ├─assets // 靜態資源文件目錄 │ ├──app.css // app.css

該示例的代碼我就不貼出來了,大家可以到本文開頭的GitHub地址去下載。

image

總結

vue.js官方提供的browserify項目模板,可以讓我們很輕松地投入到vue.js的組件開發中。熟練使用這樣的模板項目,不僅將組件代碼給分離出來了,使得組件可以被重復利用,而且有助於組件代碼的管理。

本文鏈接:http://www.cnblogs.com/keepfool/p/5677032.html文章作者:keepfool文章出處:http://www.cnblogs.com/keepfool/如果您覺得閱讀本文對您有幫助,請點一右下角的“推薦”按鈕,您的“推薦”將是我最大的寫作動力!歡迎看官們轉載,轉載之后請給出作者和原文連接。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM