Forewordcss
以前三篇大體介紹了webpack的用法,正如這個系列標題而言 從webpack 到 vue Component,因此最後一篇文章固然是要講 component, 不對應該說是結合使用,因此看官要是對 vue Component不是很瞭解的話,先去瞅瞅吧 戳我帶你去瞅瞅html
Gabbyvue
vue 官網對組件的介紹其實很多了,可是我第一次看 vue單文件組件 的介紹的時候,一陣不明覺厲之風颳的我找不到北。node
全局定義(Global definitions) 強制要求每一個 component 中的命名不得重複jquery
字符串模板(String templates) 缺少語法高亮,在 HTML 有多行的時候,須要用到醜陋的 \
webpack
不支持CSS(No CSS support) 意味着當 HTML 和 JavaScript 組件化時,CSS 明顯被遺漏git
沒有構建步驟(No build step) 限制只能使用 HTML 和 ES5 JavaScript, 而不能使用預處理器,如 Pug (formerly Jade) 和 Babeles6
這些缺點就促使了咱們要使用 vue 單文件組件了,(看到這裏,我內心有股莫名的高興!!!)github
然而,NM-MMP 後面就貼上了簡單的 demo 圖片(竟然還只是圖片),而後後面就說 「有了 .vue 組件,咱們就進入了高級 JavaScript 應用領域」 是否是很牛掰終於能夠擺脫菜鳥的衣服了,可是,可是,可是,若是你不知道 Modern JavaScript with ES2015/16,不知道打包工具 webpack/Browserify,不知道 Node Package Manager (NPM),好,很好,很是好,親,你尚未準備好,請去啃一遍這些再來。。。。。web
除了想撞牆我當時沒有其餘想法(幸虧只是沒用過webpack。。。)
Here we go
先展現一下文件目錄結構:
node_modules
src
main.js
components
app.vue
second.vue
.babelrc
index.html
package.json
webpack.config.js
先把相關的依賴給裝好(注意一下注釋只是爲了解釋,在package.json中不能寫註釋)
"devDependencies": { "babel-core": "^6.0.0", //babel 插件 "babel-loader": "^6.0.0", //babel-loader 加載器 "babel-preset-es2015": "^6.0.0", //babel預編譯es2015/es6語法 "cross-env": "^3.0.0", //跨平臺環境用來設置NODE-ENV "css-loader": "^0.25.0", "file-loader": "^0.9.0", "node-sass": "^4.5.0", "sass-loader": "^5.0.1", "vue": "^2.2.4", "vue-loader": "^10.0.0", "vue-template-compiler": "^2.1.0", "css-loader": "^0.26.2", "style-loader": "^0.13.2", "webpack": "^2.2.1", "webpack-dev-server": "^2.4.1" } //命令行(CLI)安裝 cnpm install
.babelrc
//預編譯es6語法的配置 { "presets": [ ["es2015", { "modules": false }] ] }
webpack.config.js
// var webpack = require('webpack') var path = require('path') // NodeJS中的Path對象,用於處理目錄的對象,提升開發效率。 module.exports = { // 入口文件地址,不須要寫完,會自動查找 entry: './src/main.js', output: { // 文件地址,使用絕對路徑形式 path: path.resolve(__dirname, './dist'), //[name]這裏是webpack提供的根據路口文件自動生成的名字 publicPath: '/dist/', filename: '[name].js' }, module: { loaders: [ // 解析.vue文件 { test: /\.vue$/, loader: 'vue-loader', options: { //解析.vue文件中樣式表 loaders: { // Since sass-loader (weirdly) has SCSS as its default parse mode, we map // the "scss" and "sass" values for the lang attribute to the right configs here. // other preprocessors should work out of the box, no loader config like this necessary. 'scss': 'vue-style-loader!css-loader!sass-loader', 'sass': 'vue-style-loader!css-loader!sass-loader?indentedSyntax' } // other vue-loader options go here } }, // 轉化ES6的語法 { test: /\.js$/, loader: 'babel-loader', exclude: /node_modules/ }, //編譯css並自動添加css前綴 { test: /\.css$/, loader: 'style!css!autoprefixer' }, //圖片加上base64編碼 { test: /\.(png|jpg|gif|svg)$/, loader: 'file-loader', options: { name: '[name].[ext]?[hash]' } } ] }, resolve: { // 別名,能夠直接使用別名來表明設定的路徑以及其餘,在這個項目中沒用到 alias: { 'vue$': 'vue/dist/vue.common.js' } }, // 服務器配置相關 devServer: { historyApiFallback: true, noInfo: true }, performance: { hints: false }, // 開啓source-map,webpack有多種source-map,在官網文檔能夠查到 eval-source-map 不能實現斷電調試, source-map 和 cheap-module-source-map 就沒問題 devtool: '#eval-source-map' }
src/main.js
//es6語法: import Vue from "vue" //外部引入別的庫均可以用這樣的方式,好比jquery等。。 //引入咱們編寫的測試用vue文件。 import App from './components/app.vue'; new Vue({ el:'#app', render: h => h(App) }) //vue 裏有關於 render 的介紹,我大概簡要介紹一下這裏的用途,h 是 vue 生態系統中做爲 createElement 別名的通用慣例 也是 JSX 語法的要求。若是在做用域中 h 失去做用, 在應用中會觸發報錯。 //render 所建立的 h 函數 能夠直接返回模板中dom元素,至關於 render: function(h){ return h(App) } //我的以爲因爲這裏的App 是表明的 app.vue 這個組件文件,那麼文件中的 <templete></templete>標籤中的 dom 元素將自動被拿來返回,固然還包括文件中的data屬性之類的
src/components/second.vue
<script> //es6 export default { name:"app", //data:function(){},下面是es6寫法 data () { return { msg: 'Second Component ' } }, } </script> <template> <div> <span v-html="msg"></span> </div> </template> // scoped 讓css只在這文件中生效 lang='scss' 不能寫成 sass 打包會報錯 <style lang="scss" scoped> div{ height:100px; width: 50%; border: solid 1px; margin-top: 10px; } </style>
src/components/app.vue
<script> //es6 import second from './second.vue';//導入當前目錄的second.vue export default { name:"app", //data:function(){},下面是es6寫法 data () { return { msg: 'first Component ' } }, components:{ //等價於 // second: second second } } </script> <template> <div> <div class="first"> <span>df</span> <span v-html="msg"></span> </div> <second></second> </div> </template> <style lang="scss" scoped> .first{ height:100px; width: 50%; border: solid 1px; } </style>
index.html
<html> <head> <meta charset="utf-8"> </head> <body> <div id="app"></div> <script src="dist/main.js"></script>//這是打包生成的main文件 </body> </html>
Last step 更改 package.json
// 在 scripts 中加入 dev 以後直接經過 npm運行 項目中裝的 webpack-dev-server,而不是使用全局的 webpack-dev-server "scripts": { "dev": "cross-env NODE_ENV=development webpack-dev-server --hot --inline --progress --color --port 80" }
運行(CIL)
npm run dev
ps:
若是想讓他自動打開默認瀏覽器 再 選項 "dev"
webpack-dev-server 後面加個 --open
--hot 與 --line 區別
// 不會刷新瀏覽器 $ webpack-dev-server //刷新瀏覽器 $ webpack-dev-server --inline //從新加載改變的部分,HRM(熱替換)失敗則刷新頁面 $ webpack-dev-server --inline --hot
Final
打開瀏覽器看看效果。這系列文章就所有結束,最後一篇間隔稍微長了點,不過仍是沒夭折~~~
webpack -> vue Component 從入門到放棄(三)
webpack -> vue Component 從入門到放棄(二)
webpack -> vue Component 從入門到放棄(一)
github源代碼