Vue.js
Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。
webpack
本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。
vue+webpack开发
- 案例预览
- 初始化package.json文件
cnpm init -y
- 安装plugin和loader(下载所有基本的包)
cnpm i webpack webpack-cli -g
cnpm i webpack webpack-cli -D
cnpm i webpack-dev-server -D
cnpm i html-webpack-plugin -D
cnpm i style-loader css-loader -D
cnpm i node-sass sass-loader -D
cnpm i less less-loader -D
cnpm file-loader url-loader -D
cnpm babel-loader@7 babel-core babel-plugin-transform-runtime -D
cnpm babel-preset-env babel-preset-stage-0 -D
- 在package.json的"scripts"配置本地服务器
{
"name": "02webpack_vue",
"version": "1.0.0",
"description": "",
"main": "webpack.config.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "webpack-dev-server --open --port 3000 --hot"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"babel-core": "^6.26.3",
"babel-loader": "^7.1.5",
"babel-plugin-transform-runtime": "^6.23.0",
"babel-preset-env": "^1.7.0",
"babel-preset-stage-0": "^6.24.1",
"css-loader": "^2.1.0",
"file-loader": "^3.0.1",
"html-webpack-plugin": "^3.2.0",
"less": "^3.9.0",
"less-loader": "^4.1.0",
"node-sass": "^4.11.0",
"sass-loader": "^7.1.0",
"style-loader": "^0.23.1",
"url-loader": "^1.1.2",
"webpack": "^4.29.3",
"webpack-cli": "^3.2.3",
"webpack-dev-server": "^3.1.14"
}
}
- webpack.config.js
const htmlWebpackPlugin = require('html-webpack-plugin')
const path = require('path')
const webpack = require('webpack')
module.exports = {
entry:path.join(__dirname,'/src/main.js'),
output:{
path:path.join(__dirname,'/dist'),
filename:'bundle.js'
},
plugins:[
new htmlWebpackPlugin({
template:path.join(__dirname,'/src/index.html'),
filename:'index.html'
})
],
module:{
rules:[
{test:/\.css$/,use:['style-loader','css-loader']},
{test:/\.less$/,use:['style-loader','css-loader','less-loader']},
{test:/\.scss$/,use:['style-loader','css-loader','sass-loader']},
{test:/\.(png|jpeg|jpg|bmp|gif)$/,use:'url-loader?limit=2000&name=[hash:8]-[name].[ext]'},
{test:/\.(ttf|eot|svg|woff|woff2)$/,use:'url-loader'},
{test:/\.js$/,use:'babel-loader',exclude:/node_modules/}
]
}
}
- 在案例根目录下新建 .babelrc(装换高级的es语法)
{
"presets":["env","stage-0"],
"plugins":["transform-runtime"]
}
- 在src文件目录下新建main.js、index.html等进行测试,文件内容随意(名字不能随便换,否则webpack配置也需要换)
- 运行文件
cnpm run dev
- 如果报错可能是装包过程中出错,复制上面的package.json文件到自己的package.json,cnpm i重新装包
cnpm i
- 测试成功,会自动打开默认浏览器,查看index.html
webpack使用vue
不建议
- 下载vue
cnpm i vue -S
- 在main.js引入
import Vue from '../node_modules/vue/dist/vue.js'
3. 如果直接导入的包功能是不完善的
```js
import Vue from 'vue'
//需要配置resolve
webpack推荐使用.vue这个组件模板定义组件,需要安装能够解析文件的loader
- 下载vue包
cnpm i vue -S
- 使用包
cnpm i vue-loader vue-template-compiler -D
vue-loader:vue-loader 是一个 webpack 的 loader,可以将.vue格式编写的 Vue 组件转换为 JavaScript 模块; 能带来一个现代,灵活并且非常强大的前端工作流程。vue-template-compiler常用来编译vue2.0的模板
3. 配置webpack.config.js
const htmlWebpackPlugin = require('html-webpack-plugin')
const path = require('path')
const webpack = require('webpack')
const VueLoaderPlugin = require('vue-loader/lib/plugin');
module.exports = {
entry:path.join(__dirname,'/src/main.js'),
output:{
path:path.join(__dirname,'/dist'),
filename:'bundle.js'
},
plugins:[
new htmlWebpackPlugin({
template:path.join(__dirname,'/src/index.html'),
filename:'index.html'
}),
new VueLoaderPlugin()
],
module:{
rules:[
{test:/\.css$/,use:['style-loader','css-loader']},
{test:/\.less$/,use:['style-loader','css-loader','less-loader']},
{test:/\.scss$/,use:['style-loader','css-loader','sass-loader']},
{test:/\.(png|jpeg|jpg|bmp|gif)$/,use:'url-loader?limit=2000&name=[hash:8]-[name].[ext]'},
{test:/\.(ttf|eot|svg|woff|woff2)$/,use:'url-loader'},
{test:/\.js$/,use:'babel-loader',exclude:/node_modules/},
{ test: /\.vue$/, use: 'vue-loader' } // 处理 .vue 文件的 loader
]
}
}
- VueLoaderPlugin
Vue Loader v15 现在需要配合一个 webpack 插件才能正确使用,否则会报错
vue-loader文档
- 目录
- app.vue
<template>
<div>
<h1>这是登录组件,使用 .vue 文件定义出来的--{{msg}}</h1>
</div>
</template>
<script>
export default {
data() {
// 注意:组件中的 data 必须是 function
return {
msg: "vue-loader vue-template-compiler"
};
},
methods: {
show() {
console.log("调用了 login.vue 中的 show 方法");
}
}
};
</script>
<style>
</style>
- index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Vue的学习</title>
</head>
<body>
<div id="app">
<app></app>
</div>
</body>
</html>
- main.js
import Vue from 'vue'
import app from './app.vue'
var vm = new Vue({
el:"#app",
data:{
msg:'用runtime-only,渲染不出来。使用vue-loader'
},
methods:{
},
render: c => c(app)//渲染app.vue
// render:function(creatElements){
// creatElements(login)
// }
})
- cnpm run dev
- 使用路由
cnpm i vue-router -S
在main.js引入(当然在开发中应该是抽离路由模块的)
import VueRouter from 'vue-router'
基本配置
- 复制package.json
{
"name": "02webpack_vue",
"version": "1.0.0",
"description": "",
"main": "webpack.config.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "webpack-dev-server --open --port 3000 --hot"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"babel-core": "^6.26.3",
"babel-loader": "^7.1.5",
"babel-plugin-transform-runtime": "^6.23.0",
"babel-preset-env": "^1.7.0",
"babel-preset-stage-0": "^6.24.1",
"css-loader": "^2.1.0",
"file-loader": "^3.0.1",
"html-webpack-plugin": "^3.2.0",
"less": "^3.9.0",
"less-loader": "^4.1.0",
"node-sass": "^4.11.0",
"sass-loader": "^7.1.0",
"style-loader": "^0.23.1",
"url-loader": "^1.1.2",
"vue-loader": "^15.6.2",
"vue-template-compiler": "^2.6.6",
"webpack": "^4.29.3",
"webpack-cli": "^3.2.3",
"webpack-dev-server": "^3.1.14"
},
"dependencies": {
"vue": "^2.6.6",
"vue-router": "^3.0.2"
}
}
- 下载包
cnpm i
- webpack.confg.js的配置
const htmlWebpackPlugin = require('html-webpack-plugin')
const path = require('path')
const webpack = require('webpack')
const VueLoaderPlugin = require('vue-loader/lib/plugin');
module.exports = {
entry:path.join(__dirname,'/src/main.js'),
output:{
path:path.join(__dirname,'/dist'),
filename:'bundle.js'
},
plugins:[
new htmlWebpackPlugin({
template:path.join(__dirname,'/src/index.html'),
filename:'index.html'
}),
new VueLoaderPlugin()
],
module:{
rules:[
{test:/\.css$/,use:['style-loader','css-loader']},
{test:/\.less$/,use:['style-loader','css-loader','less-loader']},
{test:/\.scss$/,use:['style-loader','css-loader','sass-loader']},
{test:/\.(png|jpeg|jpg|bmp|gif)$/,use:'url-loader?limit=2000&name=[hash:8]-[name].[ext]'},
{test:/\.(ttf|eot|svg|woff|woff2)$/,use:'url-loader'},
{test:/\.js$/,use:'babel-loader',exclude:/node_modules/},
{ test: /\.vue$/, use: 'vue-loader' } // 处理 .vue 文件的 loader
]
}
}
- .babelrc是一个json文件
{
"presets":["env","stage-0"],
"plugins":["transform-runtime"]
}