JS实现不重复导入的方法,可以通过ES6的Module
机制来实现。
步骤如下:
- 在导出模块时,使用
export
语句将模块内容输出为一个模块对象; - 在导入模块时,使用
import
语句引入模块对象,可以选择将模块内容重命名或者解构赋值; - 在某个模块中,被导入的模块只会被执行一次,重复的导入不会再执行一次。
举个例子:
// moduleA.js
const data = ['apple', 'banana', 'pear']
export default data
// moduleB.js
import data from './moduleA.js'
function printData(){
console.log(data)
}
export {printData}
// main.js
import {printData} from './moduleB.js'
import data from './moduleA.js' // 该行代码不会再执行 moduleA.js
console.log(data)
printData()
在上面的示例中,main.js
中的第二个import
语句会被JS引擎忽略,因为上面已经在moduleB.js
中通过import data from './moduleA.js'
的方式导入过了,被导入的模块已经在内存中,不会再次执行。
再举个实际开发中的例子:
// api.js
const apiMap = new Map()
export function registerApi(name, api){
if (apiMap.has(name)) throw new Error(`api ${name} already registered`)
apiMap.set(name, api)
}
export function getApi(name){
if (!apiMap.has(name)) throw new Error(`api ${name} not found`)
return apiMap.get(name)
}
// user.js
import {registerApi, getApi} from './api.js'
registerApi('user', {
// user api implement...
})
export function getCurrentUser(){
const userApi = getApi('user')
return userApi.getCurrentUser()
}
// order.js
import {registerApi, getApi} from './api.js'
registerApi('order', {
// order api implement...
})
export function getOrderList(){
const orderApi = getApi('order')
return orderApi.getOrderList()
}
在上面的示例中,api.js
中通过Map
实现了一个API的注册和获取机制,user.js
和order.js
中分别注册了user
和order
两个API,而两个模块中的import {registerApi, getApi} from './api.js'
语句会被JS引擎忽略,只有在第一次被导入的时候才会执行,以后多次导入不会再次执行api.js
模块中的代码,也不会有重复的注册。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js实现不重复导入的方法 - Python技术站