2.4.1 模块的导出
a) ES6语法
- 在ES6中使用 export default 和 export 导出模块中的成员;
- 使用 import from 和 import ‘路径’ 还有 import {a, b} from ‘模块标识’ 导入其他模块
#1. 新建test.js// 在 ES6 中,使用 export default 和 export 向外暴露成员:var info = {name: 'zs',age: 20}export default info/* 注意:export default 向外暴露的成员,可以使用任意的变量来接收在一个模块中,export default 只允许向外暴露1次在一个模块中,可以同时使用 export default 和 export 向外暴露成员*/export var title = '小星星'export var content = '哈哈哈'/*注意:使用 export 向外暴露的成员,只能使用 { } 的形式来接收,这种形式叫做 【按需导出】export 可以向外暴露多个成员, 同时如果某些成员在我们import 的时候不需要,则可以不在 {} 中定义使用 export 导出的成员,必须严格按照导出时候的名称来使用 {} 按需接收;使用 export 导出的成员,如果想换个名称来接收,可以使用 as 来起别名;*/#2. main.jsimport minfo3, { title as title123, content } from './test.js'console.log(minfo3) //这里的minfo3就是test.js中所暴露出来的default infoconsole.log(title123 + ' --- ' + content)
注意点:
#1.import命令具有提升特性foo();import { foo } from 'my_module'; // 会提升到顶部#2.import命令会执行所加载的代码,多次import同一个文件只会执行一次import 'lodash'import 'lodash'
b) CommonJS模块导出
//1.导出单个成员var foo = 'bar'function add(x, y) {return x + y}exports.foo = 'hello'exports.add = add//2.导出多个成员// 如果一个模块需要直接导出某个成员,而非挂载的方式module.exports = {add: function () {return x + y},str: 'hello'}//3.引入模块const lib = require('./test');
c) es6模块和CommonJS模块区别
1.ES6模块导入是编译时加载,CommonJS模块导入是运行时加载
const lib = require('./test'); //运行时加载,后执行import { number, incCounter } from './test2'; //编译时加载,先执行
2.ES6模块输出的是值的引用,CommonJS模块输出的是一个值的拷贝
#1.CommonJS// 01-require-lib.js//CommonJS模块化规范console.log("testtesttesttest")var counter = 3;var obj = {name:"zhangsan"}function incCounter() {counter++;obj.name = "lisi"}//导出模块//模块输出的是值的拷贝,一旦输出一个值,模块内部的变化就影响不到这个值。module.exports = {counter: counter, //拷贝obj:obj, //引用incCounter: incCounter,};// 01-require.js//如果多次通过require方式去引入同样的模块,模块的代码只会在初次引入的时候执行一次const test1 = require("./test") //运行时console.log(test1); // 3test1.incCounter();console.log(test1); // 3)const test2 = require("./test")#2.ES6// lib.jsexport let number= 3;export function incCounter() {number++;}// main.jsimport { counter, incCounter } from './lib';console.log(counter); // 3incCounter();console.log(counter); // 4
CommonJS多次加载同一模块的时候,只有第一次加载会运行一次,以后加载同一模块就直接从缓存取出该模块的module.exports属性。ES6多次加载同一模块的时候,只有第一次加载会执行一次,ES6 模块不会缓存运行结果,而是动态地去被加载的模块取值,并且变量总是绑定其所在的模块
2.4.2 .vue中的数据导出
#login.vue<template><div><h1>这是登录组件,使用 .vue 文件定义出来的 --- {{msg}}</h1><button @click="show">点我</button></div></template><script>export default {data() {// 注意:组件中的 data 必须是 functionreturn {msg: "123321"};},methods: {show() {console.log("调用了 login.vue 中的 show 方法");}}};</script>
