Webpack + vue-loader构建单文件vue组件

来源:互联网 发布:淘宝图片空间授权失败 编辑:程序博客网 时间:2024/04/29 19:43

1.开始

创建下面目录:



修改package.json:

[javascript] view plain copy
  1. {  
  2.   "name""vue",  
  3.   "version""0.0.1",  
  4.   "description""My vue",  
  5.   "author""minixu",   
  6.   "dependencies": {  
  7.     "vue""^1.0.26",  
  8.     "webpack""^1.13.1"  
  9.   },  
  10.   "devDependencies": {  
  11.     "babel-core""^6.1.2",  
  12.     "babel-loader""^6.1.0",  
  13.     "babel-plugin-transform-runtime""^6.1.2",  
  14.     "babel-preset-es2015""^6.1.2",  
  15.     "babel-preset-stage-0""^6.1.2",  
  16.     "babel-runtime""^5.8.0",  
  17.     "css-loader""^0.23.0",  
  18.     "style-loader""^0.13.0",   
  19.    "vue-html-loader""^1.2.3",  
  20.     "vue-loader""^7.3.0",   
  21.     "webpack""^1.13.1",  
  22.     "webpack-dev-server""^1.14.1"  
  23.   }  
  24. }  


加载依赖模块:

[javascript] view plain copy
  1. $npm install   
如果实在下载不下来建议使用cnpm进行下载:

[javascript] view plain copy
  1. $npm install cnpm -g     
[javascript] view plain copy
  1. $cnpm install   

配置webpack.config.js:

[javascript] view plain copy
  1. //webpack.config.js  
  2. module.exports = {  
  3.   // 入口文件  
  4.   entry: './src/main.js',  
  5.   // 编译输出的文件路径  
  6.   output: {  
  7.     //`dist`文件夹  
  8.     path: './dist',  
  9.     // 文件 `build.js` 即 dist/build.js  
  10.     filename: 'build.js',   
  11.   },  
  12.   //加载器  
  13.   module: {  
  14.     loaders: [{  
  15.       test: /\.vue$/,   
  16.       exclude: /node_modules/,  
  17.       loader: 'vue-loader'  
  18.     }, {  
  19.         test: /\.css$/,   
  20.         exclude: /node_modules/,  
  21.         loader: 'style-loader!css-loader'  
  22.       }, {  
  23.         test: /\.js$/,  
  24.         exclude: /node_modules/,  
  25.         loader: 'babel'  
  26.       }]  
  27.   },  
  28.   babel: {  
  29.     presets: ['es2015''stage-0'],  
  30.     plugins: ['transform-runtime']  
  31.   }   
  32. }  


在Vue根目录下创建index.html:

[javascript] view plain copy
  1. <html>  
  2. <head>  
  3.     <meta charset="UTF-8">  
  4.     <title>Document</title>  
  5. </head>  
  6. <body>  
  7.     <App></App>   
  8.     <script src="dist/build.js"></script>  
  9. </body>  
  10. </html>  


在src目录下创建main.js文件:

[javascript] view plain copy
  1. //es6加载模块  
  2. import Vue from 'vue'  
  3. import App from './views/index.vue'  
  4.   
  5. //创建一个vue实例,挂载在body上面  
  6. new Vue({   
  7.     el: 'body',  
  8.     components: { App }  
  9. })  

在src/views目录下创建index.vue:

[javascript] view plain copy
  1.  <pre name="code" class="javascript"><template>  
  2.     <p>{{ message }}</p>  
  3.     <input v-model="message">  
  4. </template>  
  5.   
  6.   
  7. <script>   
[javascript] view plain copy
  1.     export default{   
  2.         data(){   
  3.             return {  
  4.                 message: 'Hello Vue.js!'  
  5.             }  
  6.         }  
  7.     }  
  8. </script>  

我们所有需要的文件都准备好了,进行打包:

cmd到文件根目录输入 webpack:

打开index.html:

成功!

2.热加载

我们在上篇webpack中讲了一下热加载,现在我们运用到这个项目上来。

我们在package.json中已经依赖了webpakc-dev-server模块,所以我们直接使用

[javascript] view plain copy
  1. $webpack-dev-server  
看到启动成功

我们修改代码试试:

index.vue:

[javascript] view plain copy
  1. <template>  
  2.     <p>{{ message }}</p>  
  3.     <input v-model="message">  
  4.     <button v-on:click="reverseMessage">Reverse Message</button>  
  5. </template>  
  6.   
  7. <script>  
  8.     export default{   
  9.         data(){   
  10.             return {  
  11.                 message: 'Hello Vue.js!'  
  12.             }  
  13.         },  
  14.         methods: {  
  15.             reverseMessage: function () {  
  16.             this.message = this.message.split('').reverse().join('')  
  17.             }  
  18.         }  
  19.     }  
  20. </script>  

发现不管是刷新页面还是重启服务都没用。

那我们试试打包:


成功了????????

我们知道打包方式是生成文件到磁盘中 ,而热加载方式是生成文件到内存中。

查下官网关于Webpack-dev-server,发现配置是这样的

[javascript] view plain copy
  1. var path = require("path");  
  2. module.exports = {  
  3.   entry: {  
  4.     app: ["./app/main.js"]  
  5.   },  
  6.   output: {  
  7.     path: path.resolve(__dirname, "build"),  
  8.     publicPath: "/assets/",  
  9.     filename: "bundle.js"  
  10.   }  
  11. };  

因为我们的index.html中 的路径为dist/build.js

而内存中生成的bulid.js文件路径是不在dist文件夹下的,所以是找不到内存中的bulid.js的,找到的是在改文件夹下我们以前打包的文件。

不信删掉dist/bulid.js试试 。

所以我们需要指定一个 publicPath 

修改我们的webpack.config.js: 
[javascript] view plain copy
  1.  //webpack.config.js<pre name="code" class="javascript">module.exports = {  
  2.   // 这是一个主文件包括其他模块  
  3.   entry: './src/main.js',  
  4.   // 编译的文件路径  
  5.   output: {  
  6.     //`dist`文件夹  
  7.     path: './dist',  
  8.     // 文件 `build.js` 即 dist/build.js  
  9.     filename: 'build.js',   
  10.     publicPath: '/dist/'  
  11.   },  
  12.   module: {  
  13.     loaders: [{  
  14.       test: /\.vue$/,   
  15.       exclude: /node_modules/,  
  16.       loader: 'vue-loader'  
  17.     }, {  
  18.         test: /\.css$/,   
  19.         exclude: /node_modules/,  
  20.         loader: 'style-loader!css-loader'  
  21.       }, {  
  22.         test: /\.js$/,  
  23.         exclude: /node_modules/,  
  24.         loader: 'babel'  
  25.       }]  
  26.   },  
  27.   babel: {  
  28.     presets: ['es2015''stage-0'],  
  29.     plugins: ['transform-runtime']  
  30.   }   
  31. }  
再启动一次

[javascript] view plain copy
  1. $webpack-dev-server  

访问http://localhost:8080/webpack-dev-server/

修改index.vue

[javascript] view plain copy
  1. <template>  
  2.     <p>{{ message }}</p>  
  3.     <p> {{ message.split('').reverse().join('') }}</p>  
  4.     <input v-model="message">  
  5.     <button v-on:click="reverseMessage">Reverse Message</button>  
  6. </template>  
  7.   
  8. <script>  
  9.     export default{   
  10.         data(){   
  11.             return {  
  12.                 message: 'Hello Vue.js!'  
  13.             }  
  14.         },  
  15.         methods: {  
  16.             reverseMessage: function () {  
  17.             this.message = this.message.split('').reverse().join('')  
  18.             }  
  19.         }  
  20.     }  
  21. </script>  
点开刚刚的页面,哇塞,不用重启不用刷新就变了,好神奇!



3.vue-cli

0 0