在很多 Vue 项目开发中,常规做法:1. 定义组件, 2. 使用组件(如下代码)
//定义全局组件
Vue.component('my-component',{});
// 在模板中使用组件
new Vue({
el: '#app '
template:' '
});
这种方式在很多中小规模的项目中运作的很好,但在复杂的项目中,就有以下缺点:
所以Vue推出了单文件组件(扩展名为 .vue),由于浏览器不支持.vue文件,所以要还要通过ES6的模块化(import,export)实现组件的模块花开发,由于浏览器不支持ES6模块化,必须接祖于babel和webpack工具来辅助实现,优点如下:
###vue单文件组件开发流程
webpack打包
"devDependencies": {
"html-webpack-plugin": "^3.2.0",
"vue": "^2.5.17",
"vue-loader": "^15.4.2",
"vue-template-compiler": "^2.5.17",
"webpack": "^4.18.0"
}
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
// 导出配置模块
module.exports = {
// 设置入口文件
entry:'./src/app.js',
// 输出配置
output:{
path:path.resolve(__dirname,'./dist'),
filename:'js/[name]-bundle.js'
},
module:{
rules:[
// 匹配.vue单文件模板,并利用vue、vue-loader、vue-template-compiler进行编译
{
test:/\.vue$/,
loader:['vue-loader']
}
]
},
plugins:[
// 依据html模板生成一个自动引用你打包后的文件(js或css)的新的html页面
new HtmlWebpackPlugin({
template:'./src/index.html'
})
]
}
//ES6 引入其他模块(可以是js,css,vue单文件等)
import Vue from 'vue';
import App from './app.vue';
new Vue({
el:'#app',
// Vue 选项中的 render 函数若存在,则 Vue 构造函数不会从 template 选项或通过 el 选项指定的挂载元素中提取出的 HTML 模板编译渲染函数
render(create){
return create(App);
}
});
<template>
<div class="container">
<h1>Hello {{name}}h1>
<button class="btn btn-success">点击进入button>
div>
template>
<script>
// 导出当前组件配置选项
export default{
data(){
return{
name:'Vue单文件组件'
}
}
}
script>
<style scoped>
h1{color:#58bc58;}
style>
历史上,JavaScript一直没有模块体系(module),无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来。其他语言都有这项功能,唯独javascript没有,在这之前我们都是借助第三方工具(request.js等)来实现模块化开发,直到ES6 module的出现,成为浏览器和服务器通用的模块解决方案,完全可以取代 CommonJS 和 AMD 规范
export命令用于规定模块的对外接口,只允许导出最外层函数、类以及var、let或const声明的变量,可多次export,export出去后自动成为模块对象的属性。
PS: export后只能跟function、class、var、let、const、default、{}
基本用法
//base.js
var myName = 'laoxie';
var age = 1995;
// 多次export
export {myName};
export let gender="男";
export function show(){
console.log(666);
}
function show(){
console.log('my name is show');
}
export {show as showName};
export default {
data:{
path:'/src/'
}
}
*
作为中转模块导出,把某个模块的所有相属性/方法导出 export * from './md.js';
import命令用于导入其他模块提供的功能
//从模块对象中导入属性为default的值,并赋值给变量res,无则得到undefined
import res from './base.js';
//导入模块对象中属性为myName的值并赋值给变量myName
import {myName} from './base.js';
console.log(myName,res);
//导入模块对象中属性为myName的值并赋值给变量username
import {myName as username} from './base.js';
*
导入整个模块对象 //导入整个模块对象,并赋值给myModule变量
import * as myModule from './base.js';