概述:import:语将一个外部名字空间导入到当前名字空间,import语句首先会在当前名字空间下查找同名对象是否存在,查找时不会触发名字空间的元方法。
如果同名对象已存在并且不是指向相同的库,则会报错。
import保证不会在同一线程重复加载相同的库。外部库内的代码在一个线程中仅运行一次。
区别1:模块加载的时间
require:运行时加载
import:编译时加载(效率更高)【由于是编译时加载,所以import命令会提升到整个模块的头部】
区别2:模块的本质
require:模块就是对象,输入时必须查找对象属性
import:ES6 模块不是对象
详解import导入库的过程
import导入库时查找顺序为“内核库->标准库->用户库”。
外部库文件的物理路径与名字空间路径保持一致(将物理路径中的斜杠替换为圆点就是名字空间路径)。
我们以下面的import语句为例详解导入库的过程:
import time.ole //将外部库time.ole导入当前名字空间
1、查询库缓存
已导入的库会直接加载到当前名字空间,不会重复导入相同的库,否则继续下面的过程。
2、查询内核库
如果内核库中存在该库,导入库,否则继续下面的过程。
3、查找编译嵌入EXE的库文件
aardio会优先加载编译发布EXE时嵌入EXE文件的库模块。
4、查询标准库
如果仍然没有找到库。在启动当前进程的EXE文件根目录下的的lib目录下查询库文件,从根目录逐渐向下层子目录开始搜索,查找顺序如下(按查找顺序先后排列):
~\lib\time.ole.aardio
~\lib\time\ole.aardio
~\lib\time\ole\_.aardio
如果找到aardio代码文件或编译后的二进制aardio文件,加载并运行,并将文件路径作为参数传递给目标文件。
5、查询用户库
如果仍然没有找到,按第三步的过程,在当前工程目录\lib目录,或启动文件所在目录\lib目录下查找用户库, 查找顺序如下(按查找顺序先后排列):
\lib\time.ole.aardio
\lib\time\ole.aardio
\lib\time\ole\_.aardio
如果找到aardio代码文件或编译后的二进制aardio文件,加载并运行,并将文件路径作为参数传递给目标文件。
注意在aardio开发环境中 "~\lib\" 表示aardio.exe所在目录下的标准 库,而 "\lib\"表示虚拟根目录下的用户库。对于一个工程来说工程目录就是虚拟根目录,对于一个在工程之外单独运行的aardio文件 - 文件所在的目录就是虚拟根目录。对于发布后的EXE文件来说,"\lib\"与"~\lib\"默认都是指EXE文件启动目录,在创建线程、协程时 - 可以在参数中改变虚拟根目录。
6、查询扩展库
如果当前是运行在aardio开发环境中,仍然没有找到匹配的库文件,aardio会检查扩展库列表并安装扩展库。
6、检查库是否加载成功
最后aardio检查目标文件是否成功运行,
目标文件是否创建了新的名字空间全局名字空间..time.ole。
如果导入名字空间成功,则导入当前名字空间( self 名字空间 )。