1.安裝vue-cli
再安裝完成npm以後,利用npm安裝vue-cli,全局安裝:npm insall -g vue-cli。假若npm速度慢,建議替換爲cnpm(https://npm.taobao.org/)。html
2.初始化vue項目
命令格式爲:vue-cli init
(1)templeta-name是模板名稱,vue官方提供了五中,分別以下:
webpack-一個全面的webpack+vue-loader的模板,功能包括熱加載,linting,檢測和CSS擴展。
webpack-simple-一個簡單webpack+vue-loader的模板,不包含其餘功能,讓你快速的搭建vue的開發環境。
browserify-一個全面的Browserify+vueify 的模板,功能包括熱加載,linting,單元檢測。
browserify-simple-一個簡單Browserify+vueify的模板,不包含其餘功能,讓你快速的搭建vue的開發環境。
simple-一個最簡單的單頁應用模板。
最經常使用的是webpack模板。
(2)project-name是項目名稱
(3)這個初始化命令是一條交互命令,會提示你完善項目信息,好比項目描述,做者信息等。具體以下:
Project name :項目名稱 ,若是不須要更改直接回車就能夠了。注意:這裏不能使用大寫,因此我把名稱改爲了vueclitest
Project description:項目描述,默認爲A Vue.js project,直接回車,不用編寫。
Author:做者,若是你有配置git的做者,他會讀取。
Install vue-router? 是否安裝vue的路由插件,咱們這裏須要安裝,因此選擇Y
Use ESLint to lint your code? 是否用ESLint來限制你的代碼錯誤和風格。咱們這裏不須要輸入n,若是你是大型團隊開發,最好是進行配置。
setup unit tests with Karma + Mocha? 是否須要安裝單元測試工具Karma+Mocha,咱們這裏不須要,因此輸入n。
Setup e2e tests with Nightwatch?是否安裝e2e來進行用戶行爲模擬測試,咱們這裏不須要,因此輸入n。
(4)項目初始化完成以後,還須要作三件事
進入項目目錄;cd <項目名稱>
安裝項目依賴;npm install
運行項目,查看demo。npm run dev
3.vue-cli項目結構
Ps:因爲版本實時更新和你選擇安裝的不一樣(這裏列出的是模板爲webpack的目錄結構),因此你看到的有可能和下邊的有所差異。
重要文件講解: package.json package.json文件是項目根目錄下的一個文件,定義該項目開發所須要的各類模塊以及一些項目配置信息(如項目名稱、版本、描述、做者等)。 package.json 裏的scripts字段,這個字段定義了你能夠用npm運行的命令。在開發環境下,在命令行工具中運行npm run dev 就至關於執行 node build/dev-server.js .也就是開啓了一個node寫的開發行建議服務器。由此能夠看出script字段是用來指定npm相關命令的縮 寫。
"scripts": {
"dev": "node build/dev-server.js",
"build": "node build/build.js"
},
dependencies字段和devDependencies字段node
dependencies字段指項目運行時所依賴的模塊;
devDependencies字段指定了項目開發時所依賴的模塊;
在命令行中運行npm install命令,會自動安裝dependencies和devDempendencies字段中的模塊。package.json還有不少相關配置,若是你想全面瞭解,能夠專門去百度學習一下。webpack
webpack配置相關
咱們在上面說了運行npm run dev 就至關於執行了node build/dev-server.js,說明這個文件至關重要,先來熟悉一下它。 我貼出代碼並給出重要的解釋。git
dev-server.jsgithub
// 檢查 Node 和 npm 版本
require('./check-versions')()web
// 獲取 config/index.js 的默認配置
var config = require('../config')vue-router
// 若是 Node 的環境沒法判斷當前是 dev / product 環境
// 使用 config.dev.env.NODE_ENV 做爲當前的環境vue-cli
if (!process.env.NODE_ENV) process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV)express
// 使用 NodeJS 自帶的文件路徑工具
var path = require('path')
// 使用 express
var express = require('express')
// 使用 webpack
var webpack = require('webpack')
// 一個能夠強制打開瀏覽器並跳轉到指定 url 的插件
var opn = require('opn')
// 使用 proxyTable
var proxyMiddleware = require('http-proxy-middleware')
// 使用 dev 環境的 webpack 配置
var webpackConfig = require('./webpack.dev.conf')
// default port where dev server listens for incoming traffic
// 若是沒有指定運行端口,使用 config.dev.port 做爲運行端口
var port = process.env.PORT || config.dev.port
// Define HTTP proxies to your custom API backend
// https://github.com/chimurai/http-proxy-middleware
// 使用 config.dev.proxyTable 的配置做爲 proxyTable 的代理配置
var proxyTable = config.dev.proxyTable
// 使用 express 啓動一個服務
var app = express()
// 啓動 webpack 進行編譯
var compiler = webpack(webpackConfig)
// 啓動 webpack-dev-middleware,將 編譯後的文件暫存到內存中
var devMiddleware = require('webpack-dev-middleware')(compiler, {
publicPath: webpackConfig.output.publicPath,
stats: {
colors: true,
chunks: false
}
})
// 啓動 webpack-hot-middleware,也就是咱們常說的 Hot-reload
var hotMiddleware = require('webpack-hot-middleware')(compiler)
// force page reload when html-webpack-plugin template changes
compiler.plugin('compilation', function (compilation) {
compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) {
hotMiddleware.publish({ action: 'reload' })
cb()
})
})
// proxy api requests
// 將 proxyTable 中的請求配置掛在到啓動的 express 服務上
Object.keys(proxyTable).forEach(function (context) {
var options = proxyTable[context]
if (typeof options === 'string') {
options = { target: options }
}
app.use(proxyMiddleware(context, options))
})
// handle fallback for HTML5 history API
// 使用 connect-history-api-fallback 匹配資源,若是不匹配就能夠重定向到指定地址
app.use(require('connect-history-api-fallback')())
// serve webpack bundle output
// 將暫存到內存中的 webpack 編譯後的文件掛在到 express 服務上
app.use(devMiddleware)
// enable hot-reload and state-preserving
// compilation error display
// 將 Hot-reload 掛在到 express 服務上
app.use(hotMiddleware)
// serve pure static assets
// 拼接 static 文件夾的靜態資源路徑
var staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory)
// 爲靜態資源提供響應服務
app.use(staticPath, express.static('./static'))
// 讓咱們這個 express 服務監聽 port 的請求,而且將此服務做爲 dev-server.js 的接口暴露
module.exports = app.listen(port, function (err) {
if (err) {
console.log(err)
return
}
var uri = 'http://localhost:' + port
console.log('Listening at ' + uri + '\n')
// when env is testing, don't need open it
// 若是不是測試環境,自動打開瀏覽器並跳到咱們的開發地址
if (process.env.NODE_ENV !== 'testing') {
opn(uri)
}
})
// 檢查 Node 和 npm 版本
require('./check-versions')()
// 獲取 config/index.js 的默認配置
var config = require('../config')
// 若是 Node 的環境沒法判斷當前是 dev / product 環境
// 使用 config.dev.env.NODE_ENV 做爲當前的環境
if (!process.env.NODE_ENV) process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV)
// 使用 NodeJS 自帶的文件路徑工具
var path = require('path')
// 使用 express
var express = require('express')
// 使用 webpack
var webpack = require('webpack')
// 一個能夠強制打開瀏覽器並跳轉到指定 url 的插件
var opn = require('opn')
// 使用 proxyTable
var proxyMiddleware = require('http-proxy-middleware')
// 使用 dev 環境的 webpack 配置
var webpackConfig = require('./webpack.dev.conf')
// default port where dev server listens for incoming traffic
// 若是沒有指定運行端口,使用 config.dev.port 做爲運行端口
var port = process.env.PORT || config.dev.port
// Define HTTP proxies to your custom API backend
// https://github.com/chimurai/http-proxy-middleware
// 使用 config.dev.proxyTable 的配置做爲 proxyTable 的代理配置
var proxyTable = config.dev.proxyTable
// 使用 express 啓動一個服務
var app = express()
// 啓動 webpack 進行編譯
var compiler = webpack(webpackConfig)
// 啓動 webpack-dev-middleware,將 編譯後的文件暫存到內存中
var devMiddleware = require('webpack-dev-middleware')(compiler, {
publicPath: webpackConfig.output.publicPath,
stats: {
colors: true,
chunks: false
}
})
// 啓動 webpack-hot-middleware,也就是咱們常說的 Hot-reload
var hotMiddleware = require('webpack-hot-middleware')(compiler)
// force page reload when html-webpack-plugin template changes
compiler.plugin('compilation', function (compilation) {
compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) {
hotMiddleware.publish({ action: 'reload' })
cb()
})
})
// proxy api requests
// 將 proxyTable 中的請求配置掛在到啓動的 express 服務上
Object.keys(proxyTable).forEach(function (context) {
var options = proxyTable[context]
if (typeof options === 'string') {
options = { target: options }
}
app.use(proxyMiddleware(context, options))
})
// handle fallback for HTML5 history API
// 使用 connect-history-api-fallback 匹配資源,若是不匹配就能夠重定向到指定地址
app.use(require('connect-history-api-fallback')())
// serve webpack bundle output
// 將暫存到內存中的 webpack 編譯後的文件掛在到 express 服務上
app.use(devMiddleware)
// enable hot-reload and state-preserving
// compilation error display
// 將 Hot-reload 掛在到 express 服務上
app.use(hotMiddleware)
// serve pure static assets
// 拼接 static 文件夾的靜態資源路徑
var staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory)
// 爲靜態資源提供響應服務
app.use(staticPath, express.static('./static'))
// 讓咱們這個 express 服務監聽 port 的請求,而且將此服務做爲 dev-server.js 的接口暴露
module.exports = app.listen(port, function (err) {
if (err) {
console.log(err)
return
}
var uri = 'http://localhost:' + port
console.log('Listening at ' + uri + '\n')
// when env is testing, don't need open it
// 若是不是測試環境,自動打開瀏覽器並跳到咱們的開發地址
if (process.env.NODE_ENV !== 'testing') {
opn(uri)
}
})
webpack.base.confg.js webpack的基礎配置文件
...
...
module.export = {
// 編譯入口文件
entry: {},
// 編譯輸出路徑
output: {},
// 一些解決方案配置
resolve: {},
resolveLoader: {},
module: {
// 各類不一樣類型文件加載器配置
loaders: {
...
...
// js文件用babel轉碼
{
test: /.js$/,
loader: 'babel',
include: projectRoot,
// 哪些文件不須要轉碼
exclude: /node_modules/
},
...
...
}
},
// vue文件一些相關配置
vue: {}
}
module.export = { // 編譯入口文件 entry: {}, // 編譯輸出路徑 output: {}, // 一些解決方案配置 resolve: {}, resolveLoader: {}, module: { // 各類不一樣類型文件加載器配置 loaders: { ... ... // js文件用babel轉碼 { test: /.js$/, loader: 'babel', include: projectRoot, // 哪些文件不須要轉碼 exclude: /node_modules/ }, ... ... } }, // vue文件一些相關配置 vue: {} }