Ubuntu 22.04搭建OpenStreeMap地址解析服务(保姆级教程)
1.数据准备
1.1.全球数据
下载地址:https://planet.openstreetmap.org/
1.2.特定区域的数据
下载地址:Geofabrik Download Server
2.安装必要的软件包
2.1.更新系统软件包
sudo apt updatesudo apt upgrade
2.2.安装所需要的软件包
执行下面的命令,一步安装所需要的配套软件。
sudo apt install -y build-essential cmake g++ libboost-dev libboost-system-dev \libboost-filesystem-dev libexpat1-dev zlib1g-dev \libbz2-dev libpq-dev liblua5.3-dev lua5.3 lua-dkjson \nlohmann-json3-dev postgresql-14-postgis-3 \postgresql-contrib-14 postgresql-14-postgis-3-scripts \php-cli php-pgsql php-intl libicu-dev python3-dotenv \python3-psycopg2 python3-psutil python3-jinja2 \python3-icu python3-datrie python3-sqlalchemy \python3-asyncpg python3-yaml git
3.配置postgresql
3.1. 切换到 postgres 用户
在 Linux 系统中,默认安装 PostgreSQL 后会创建一个名为 postgres
的系统用户,你可以使用以下命令切换到该用户:
sudo su - postgres
执行此命令后,你将进入 postgres
用户的环境,命令行提示符通常会改变以表明当前用户身份。
3.2. 进入 PostgreSQL 交互环境
在 postgres
用户环境下,使用以下命令进入 PostgreSQL 的交互式 shell(psql
):
psql
此时,你会看到类似 postgres=#
的提示符,表明已成功进入 PostgreSQL 数据库管理系统。
3.3. 修改密码
在 psql
环境中,使用 ALTER USER
命令来修改 postgres
用户的密码。例如,要将密码设置为 newpassword
(请将 newpassword
替换为你实际想要设置的强密码),执行以下命令:
ALTER USER postgres WITH PASSWORD 'newpassword';
执行完上述 SQL 语句后,如果没有报错,说明密码修改成功。
3.4. 退出 PostgreSQL 交互环境和 postgres 用户
修改完密码后,输入以下命令退出 psql
交互环境:
\q
然后输入以下命令退出 postgres
用户,返回到原来的用户环境:
exit
3.5.增加www-data账户
sudo -u postgres createuser www-data
如果这步不执行,后面导入数据的时候会提示www-data账户不存在,详情参考5.2.2
3.6.修改postgresql.conf配置文件
默认是在:/etc/postgresql/14/main目录下:
sudo vim /etc/postgresql/14/main/postgresql.conf
按下面修改这些配置项即可。
shared_buffers = 2GB
work_mem = 50MB
maintenance_work_mem = 10GB
fsync = off
synchronous_commit= off
full_page_writes = off
checkpoint_timeout = 10min
checkpoint_completion_target = 0.9
effective_cache_size = 24GB
4.下载并编译Nominatim
4.1.下载Nominatim
下载地址:https://github.com/osm-search/Nominatim
找一个自己喜欢的版本下载
下载后拷贝到服务器,解压即可:例如我放在/opt目录下
#进入/opt目录
cd /opt
#我选择的是4.5.0版本,解压命令如下
unzip Nominatim-4.5.0.zip
进入解压后的目录:
cd Nominatim-4.5.0
4.2.编译Nominatim
在Nominatim-4.5.0目录下创建编译目录/build
mkdir /opt/Nominatim-4.5.0/build
cd /opt/Nominatim-4.5.0/build
然后执行命令:
cmake ..
这时候会提示 osm2pgsql是空的,需要下载osm2pgsql
点击这里可以跳转到下载地址
然后执行下载命令:
# 返回到Nominatim-4.5.0目录下
cd /opt/Nominatim-4.5.0
#下载
git clone --recursive https://github.com/osm2pgsql-dev/osm2pgsql.git
我们删除/build目录下之前编译生成的文件,再进行编译命令:
cd /build
cmake ..
缺少country_osm_grid.sql文件
按照提示执行下面的命令即可:
wget -O /opt/Nominatim-4.5.0/data/country_osm_grid.sql.gz https://www.nominatim.org/data/country_grid.sql.gz
再次清理之前的编译文件,重新编译:
cd /build
cmake ..
编译完毕,执行:make
make
最后执行下面命令完成Nominatim的编译
sudo make install
4.3.安装psycopg
Nominatim 通常使用 psycopg2
,可以按照以下命令进行安装:
pip install psycopg2-binary
但是我的环境使用的是psycopg3,可以使用命令:
pip install psycopg[binary]
如果这步不执行会出现5.2.1问题。
5.数据导入
5.1.执行导入
数据下载方式有两种,一种是在/opt/Nominatim-4.5.0/data目录下执行下载命令:
cd /opt/Nominatim-4.5.0/datawget https://planet.openstreetmap.org/pbf/planet-latest.osm.pbf
一种是下载后将文件拷贝到服务器中,建议这种,下载方式在1中已经说明。
在 /opt/Nominatim-4.5.0/data目录下执行命令
nominatim import --osm-file planet-latest.osm.pbf
如果我们导入的数据量非常庞大,而且控制台不希望一直开着查看输出的进度,那么我们可以将进度打印到日志文件,导入命令如下:
nominatim import --osm-file planet-latest.osm.pbf > nominatim_import.log 2>&1
正常情况下会开始导入数据导入
经历很长的一段时间后,可以看到数据导入成功的提示
这时候还没结束,还需要继续等待,过了几个小时后,会继续打印日志
5.2.异常
5.2.1.No module named 'psycopg'
给出的错误信息 ModuleNotFoundError: No module named 'psycopg'
可知,Python 解释器在运行时未能找到 psycopg
模块,而 psycopg
是用于与 PostgreSQL 数据库进行交互的库,可以使用 pip
来安装 psycopg
模块。psycopg
有两个主要版本,psycopg2
是传统版本,psycopg3
是新版本。
Nominatim 通常使用 psycopg2
,可以按照以下命令进行安装:
pip install psycopg2-binary
但是我的环境使用的是psycopg3,可以使用命令:
pip install psycopg[binary]
然后再执行导入命令:
nominatim import --osm-file planet-latest.osm.pbf
这里时候如果我们没有清理数据库会提示数据库已经存在
执行清理数据库的命令:
如果过程中执行失败,需要重新导入都需要先执行清理数据库的命令。
dropdb nominatim
5.2.2.www-data账户不存在
然后再执行一次导入命令:
nominatim import --osm-file planet-latest.osm.pbf
发现提示www-data账户不存在,需要创建。执行创建用户的命令:
sudo -u postgres createuser www-data
创建后再次清理数据库,执行导入操作,看到下面的进度说明我们导入开始,等待导入结束。这个是非常耗时的,确保服务器的稳定性。否则要重头再来。
5.2.3.内存不足,导致osm2pgsql意外中断
如果在导入过程中出现内存不足,导致osm2pgsql意外中断,则可以采用增加虚拟内存的方式进行临时解决,有条件的可以增加物理内存条。
Processing: Node(1004520k 357.2k/s) Way(0k 0.00k/s) Relation(0 0.0/s)Traceback (most recent call last):File "/usr/local/bin/nominatim", line 12, in <module>exit(cli.nominatim(module_dir='/usr/local/lib/nominatim/module',File "/usr/local/lib/nominatim/lib-python/nominatim_db/cli.py", line 260, in nominatimreturn get_set_parser().run(**kwargs)File "/usr/local/lib/nominatim/lib-python/nominatim_db/cli.py", line 122, in runret = args.command.run(args)File "/usr/local/lib/nominatim/lib-python/nominatim_db/clicmd/setup.py", line 86, in runreturn asyncio.run(self.async_run(args))File "/usr/lib/python3.10/asyncio/runners.py", line 44, in runreturn loop.run_until_complete(main)File "/usr/lib/python3.10/asyncio/base_events.py", line 649, in run_until_completereturn future.result()File "/usr/local/lib/nominatim/lib-python/nominatim_db/clicmd/setup.py", line 105, in async_runself._base_import(args)File "/usr/local/lib/nominatim/lib-python/nominatim_db/clicmd/setup.py", line 171, in _base_importdatabase_import.import_osm_data(files,File "/usr/local/lib/nominatim/lib-python/nominatim_db/tools/database_import.py", line 135, in import_osm_datarun_osm2pgsql(options)File "/usr/local/lib/nominatim/lib-python/nominatim_db/tools/exec_utils.py", line 77, in run_osm2pgsqlsubprocess.run(cmd, cwd=options.get('cwd', '.'),File "/usr/lib/python3.10/subprocess.py", line 526, in runraise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command '[PosixPath('/usr/local/lib/nominatim/osm2pgsql'), '--create', '--slim', '--log-progress', 'true', '--number-processes', '1', '--cache', '10210', '--style', '/usr/local/etc/nominatim/import-extratags.lua', '--output', 'flex', 'planet-latest.osm.pbf']' died with <Signals.SIGKILL: 9>.
我采用的方法是增加虚拟内存:
(1)查看当前虚拟内存使用情况
使用命令free -h
可以查看当前系统的虚拟内存使用情况。
(2)创建新的交换文件
确定交换文件的大小和位置,例如创建一个 32GB 的交换文件在/swapfile
路径下,使用命令:
sudo fallocate -l 32G /swapfile
你可以根据实际需求调整大小
设置文件权限,确保只有 root 用户可以读写这个文件:
sudo chmod 600 /swapfile
将新文件设为交换文件:
sudo mkswap /swapfile
启用交换文件:
sudo swapon /swapfile
为了确保系统重启后虚拟内存仍然可用,需要将交换文件添加到/etc/fstab
文件中。打开该文件:
sudo vim /etc/fstab
在文件末尾添加以下行:
/swapfile none swap sw 0 0
(3)验证虚拟内存修改是否生效
使用命令:
free -h
查看虚拟内存是否已经成功修改并显示在Swap
列中。
一般来说,交换文件的大小可以根据物理内存的大小来确定。在过去,通常建议交换文件大小为物理内存的 1.5 到 2 倍。例如,如果系统有 4GB 的物理内存,那么交换文件可以设置为 6GB 到 8GB。然而,随着物理内存容量的不断增加,这个比例可以适当降低。对于现代系统,尤其是那些拥有 8GB 或更多物理内存的系统,交换文件大小可以设置为物理内存的 0.5 到 1 倍。
因为我的物理内存是32GB,所以我这里将交换文件也设置为32GB。
5.2.4."/var/run/postgresql/.s.PGSQL.5432" failed: 权限不够
connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: 权限不够
(1)编辑 postgresql.conf
文件
sudo vim /etc/postgresql/<版本号>/main/postgresql.conf
检查 listen_addresses
和 port
设置
listen_addresses = 'localhost' # 或者 listen_addresses = '*'
port = 5432
保存并退出文件。
(2)编辑 pg_hba.conf
文件
sudo vim /etc/postgresql/<版本号>/main/pg_hba.conf
确保有允许本地连接的配置项,例如:
local all all trust
host all all 127.0.0.1/32 trust
host all all ::1/128 trust
这里的 trust
表示允许无密码连接,在生产环境中建议使用更安全的认证方式,如 md5
。
(3)重启 PostgreSQL 服务
sudo systemctl restart postgresql
5.3.导入完毕
经历长时间的等待(5天时间),终于将全球数据导入到了数据库,算上下载数据,整个过程需要10来天左右,真不易。
6.部署应用服务
6.1.安装apache2
sudo apt install -y apache2 libapache2-mod-php
6.2.创建一个web目录
mkdir /opt/nominatim-web
数据库导入完毕后会在data目录下自动生成一个website的目录,将website所有文件复制到/opt/nominatim-web
sudo cp -r /opt/Nominatim-4.5.0/data/website/ /opt/nominatim-web/
6.3.配置并启动nominatim web
在apache配置中为nominatim添加一个配置。
sudo tee /etc/apache2/conf-available/nominatim.conf << EOFAPACHECONF
<Directory "/opt/nominatim-web/website">Options FollowSymLinks MultiViewsAddType text/html .phpDirectoryIndex search.phpRequire all granted
</Directory>Alias /nominatim /opt/nominatim-web/website
EOFAPACHECONF
然后启用配置并重启 apache
sudo a2enconf nominatimsudo systemctl restart apache2
正常情况下,我们在浏览器输入:
http://你的IP地址/nominatim//reverse?format=jsonv2&accept-language=en&lat=22.56955&lon=120.651554
就可以返回下面的字符串:
{"place_id":193008953,"licence":"Data © OpenStreetMap contributors, ODbL 1.0. https://osm.org/copyright","osm_type":"way","osm_id":265424501,"lat":"22.56946435874501","lon":"120.65190743779885","place_rank":26,"category":"highway","type":"tertiary","importance":0.0533433333333333,"addresstype":"road","name":"佳興道路","display_name":"佳興道路, Taiwu Village, Taiwu, Pingtung County, 921, Taiwan","address":{"road":"佳興道路","city_district":"Taiwu Village","town":"Taiwu","county":"Pingtung County","ISO3166-2-lvl4":"TW-PIF","postcode":"921","country":"Taiwan","country_code":"tw"},"boundingbox":["22.566305","22.5732423","120.6493797","120.660727"]}
如图:
6.4.应用程序无法通过 Unix 域套接字连接到 PostgreSQL 服务器问题排查
浏览器访问解析地址时候,如果出现下面的问题,说明应用程序无法通过 Unix 域套接字连接到 PostgreSQL 服务器,通常是由于权限问题或服务未运行导致的。
确认 PostgreSQL 服务状态
sudo systemctl status postgresql
如果服务未运行:
sudo systemctl start postgresql
sudo systemctl enable postgresql # 开机自启
检查 Unix 域套接字文件权限
ls -la /var/run/postgresql/
正常输出示例
drwxrwxr-x 2 postgres postgres 80 May 13 15:30 .
drwxr-xr-x 13 root root 420 May 13 15:30 ..
srwxrwxrwx 1 postgres postgres 0 May 13 15:30 .s.PGSQL.5432
问题排查
- 如果目录或套接字文件不存在,可能是 PostgreSQL 未正确启动。
- 如果权限不是
srwxrwxrwx
,尝试:sudo chmod 777 /var/run/postgresql/
验证 PostgreSQL 配置
编辑 /etc/postgresql/14/main/postgresql.conf
:
sudo vim /etc/postgresql/14/main/postgresql.conf
确保以下配置正确:
unix_socket_directories = '/var/run/postgresql'
port = 5432
listen_addresses = 'localhost' # 或 '*' 允许远程访问
重启服务使配置生效:
sudo systemctl restart postgresql
添加用户到 postgres 组:
将当前用户(如 www-data
)添加到 postgres
组:
sudo usermod -aG postgres www-data
重新登录会话(或重启系统)使组变更生效。
相关文章:

Ubuntu 22.04搭建OpenStreeMap地址解析服务(保姆级教程)
1.数据准备 1.1.全球数据 下载地址:https://planet.openstreetmap.org/ 1.2.特定区域的数据 下载地址:Geofabrik Download Server 2.安装必要的软件包 2.1.更新系统软件包 sudo apt updatesudo apt upgrade 2.2.安装所需要的软件包 执行下面的命…...

sqli—labs第五关——报错注入
一:判断输入类型 首先测试 ?id1 回显You are in... 渐进测试?id1 报错分析: 出现引号提示——“”,可能是字符型 继续测试?id1--(用注释符修复了语法错误) 回显You are in... 说明就是字符型 因为能用注释符…...

从海洋生物找灵感:造个机器人RoboPteropod,它能在水下干啥?
大家好!在如今人类对水下环境探索不断深入的时代,从水下考古到珊瑚礁考察,各种任务都离不开水下机器人的助力。但传统水下机器人尺寸较大,在狭窄的水下空间施展不开。今天,我们就来认识一款受海洋小生物启发而设计的仿…...

FastAPI系列16:从API文档到TypeScript 前端客户端(SDKs)
从API文档到TypeScript 前端客户端(SDKs) 快速入门生成一个TypeScript 客户端测试生成的TypeScript 客户端 API标签与客户端生成生成带有标签的 TypeScript 客户端 自定义Operation ID使用自定义Operation ID生成TypeScript客户端 在 FastAPI系列15&…...
为什么 Redis 设计为单线程?6.0 版本为何引入多线程?
Redis 6.0引入多线程的核心目的是优化网络I/O处理,通过分离I/O操作与命令执行,在保持数据一致性的前提下,充分利用多核CPU资源提升高并发场景下的性能,同时保持向后兼容性。以下是对Redis单线程设计与6.0版本引入多线程的详细解析…...
C# 使用HttpClient下载文件
本章讲述:如何在C#中使用HttpClient直接从阿里云OSS下载文件。 步骤1: 添加必要的命名空间 using System; using System.IO; using System.Net.Http; 步骤2: 创建下载方法 以下是使用HttpClient下载文件的示例代码: public class OssDownloader {//d…...

CS016-2-unity ecs
目录 【23】射击改进 【24】僵尸生成器 编辑【25】随机行走 【27】射击光效 【23】射击改进 a. 当距离目标太远的时候,要继续移动。而当距离目标到达攻击距离之后,则停止移动。 上图中的if:判断自身和目标的距离是否大于攻击距离&#…...

CST软件对OPERACST软件联合仿真汽车无线充电站对人体的影响
上海又收紧了新能源车的免费上牌政策。所以年前一些伙伴和我探讨过买新能源汽车的问题,小伙伴们基本纠结的点是买插电还是纯电?我个人是很抗拒新能源车的,也开过坐过。个人有几个观点: 溢价过高,不保值。实际并不环保…...

华为2024年报:鸿蒙生态正在取得历史性突破
华为于2025年03月31日发布2024年年度报告。报告显示,华为经营结果符合预期,实现全球销售收入 8,621 亿元人民币,净利润 626 亿元人民币。2024 年研发投入达到 1,797 亿元人民币,约占全年收入的 20.8%,近十年累计投入的…...
策略模式-枚举实现
策略模式的实现方法有很多,可以通过策略类if,else实现。下面是用枚举类实现策略模式的方法。 定义一个枚举类,枚举类有抽象方法,每个枚举都实现抽象方法。这个策略,实现方法是工具类的很实现,代码简单好理解 枚举实现…...
C++中多重继承下的虚表结构
在 C 的多重继承 中,虚表(vtable)结构会变得更加复杂。 一、基础回顾:单继承下的虚表结构 类中含有虚函数 → 编译器生成虚表(每类一张);每个对象有一个隐藏的虚表指针(vptr&#x…...

LabVIEW的CAN通讯测试程序
该程序是基于 NI LabVIEW 平台开发的 CAN(Controller Area Network,控制器局域网)通讯测试程序。主要功能是对 CAN 通讯过程进行模拟、数据传输与验证,确保 CAN 通讯的正常运行和数据的准确传输。 程序详细说明 接口选择ÿ…...

Spring Boot 使用Itext绘制并导出PDF
最终效果 其实可以加分页,但是没有那么精细的需求,所以我最后就没有加,有兴趣的可以尝试下。 项目依赖 <!-- Spring Boot 版本有点老 --> <spring-boot.version>2.3.12.RELEASE</spring-boot.version><!-- 依…...
访问 Docker 官方镜像源(包括代理)全部被“重置连接”或超时
华为云轻量应用服务器(Ubuntu 系统) 遇到的问题是: 🔒 访问 Docker 官方镜像源(包括代理)全部被“重置连接”或超时了,说明你这台服务器的出境网络对这些国外域名限制很严格,常见于华…...
RPC框架源码分析学习(二)
RPC框架源码分析与原理解读 前言 在分布式系统开发中,远程过程调用(RPC)是一项基础且关键的技术。通过对KVstorageBaseRaft-cpp项目RPC模块的源码分析,我深入理解了RPC框架的工作原理和实现细节。本文将从程序员视角分享我的学习心得。 框架概述 本项…...

【测试】BUG
目录 1、描述BUG的要素: 2、BUG的级别 3、BUG的状态的流转 4、与开发产⽣争执怎么办(⾼频考题) 什么是BUG??? 程序与规格说明之间的不匹配才是错误 1、描述BUG的要素: 问题出现的版本、问…...
MongoClient和AsyncIOMotorClient的区别和用法
示例代码: from motor.motor_asyncio import AsyncIOMotorClient from pymongo import MongoClient🔍 这两个库分别是: 名字说明举个例子pymongo.MongoClient同步版 的 MongoDB 客户端(常规阻塞式操作)你在主线程里一…...

Mac 环境下 JDK 版本切换全指南
概要 在 macOS 上安装了多个 JDK 后,可以通过系统自带的 /usr/libexec/java_home 工具来查询并切换不同版本的 Java。只需在终端中执行 /usr/libexec/java_home -V 列出所有已安装的 JDK,然后将你想使用的版本路径赋值给环境变量 JAVA_HOME,…...

Pillow 移除或更改了 FreeTypeFont.getsize() 方法
w, h self.font.getsize(label) # text width, height AttributeError: FreeTypeFont object has no attribute getsize 在Pillow 项目的变更日志里可以查到哪个版本移除了 getsize() 方法,Pillow仓库: Releases python-pillow/Pillow GitHub 因为…...
数据结构中链表的含义与link
在数据结构中,链表是一种常见的数据结构,它由一组节点组成,每个节点包含两部分:数据部分和指针部分。指针部分用于指向下一个节点的地址。这种结构允许高效的插入和删除操作。 链表的节点表示 链表节点的基本结构可以用以下伪代码表示: Node {data // 存储的数据next /…...

视频编辑软件无限音频、视频、图文轨
威力导演APP的特色功能包括无限音频、视频、图文轨,以及上百种二/三维特技转场、音/视频滤镜和多种音视频混编输出。此外,它还支持实时高清HDV格式、模拟信号输出,并具有DV25、DVACM、DV、HDV输入和输出等功能。在视频编辑领域,威…...
NVMe-oF(NVMe over Fabrics)
技术背景与定义 传统存储协议(如iSCSI、FC)无法发挥NVMe SSD性能(如延迟<100μs、IOPS>100万)。NVMe-oF(NVMe over Fabrics)由NVM Express组织于2016年发布,将NVMe协议从本地访问扩展到了…...

uniapp-商城-53-后台 商家信息(更新修改和深浅copy)
1、概述 文章主要讨论了在数据库管理中如何处理用户上传和修改商家信息的问题,特别是通过深浅拷贝技术来确保数据更新的准确性和安全性。 首先,解释了深拷贝和浅拷贝的区别:浅拷贝使得两个变量共享相同的内存地址,而深拷贝则创建新…...
配置 Spark 以 YARN 模式
以下是配置 Spark 以 YARN 模式运行的详细步骤: 环境准备 安装 JDK:所有节点需安装 JDK 1.8 或以上版本,并配置环境变量,确保 JAVA_HOME 正确指向安装路径。安装 Hadoop:安装 Hadoop(推荐 3.x 版本&#…...

[Java实战]Spring Boot 整合 Thymeleaf (十)
[Java实战]Spring Boot 整合 Thymeleaf (十) 引言 在 Java Web 开发领域,Thymeleaf 以其自然模板、无缝 Spring 集成和强大的表达式引擎脱颖而出,成为 Spring Boot 官方推荐的模板引擎。本文将深度解析 Spring Boot 与 Thymelea…...
NGINX 开源与社区动态:从基石到浪潮,持续演进的生态力量
NGINX 之所以能够成为全球应用最为广泛的 Web 服务器和反向代理软件之一,其成功的核心驱动力无疑是开源。开放的源代码、活跃的社区参与以及透明的开发过程,共同铸就了 NGINX 的辉煌。然而,正如所有大型开源项目一样,NGINX 的开源之路也并非一帆风顺,其社区动态也时常涌现…...

监控易一体化运维:网络流量分析的智慧引擎
在数字化时代,企业运营与网络紧密相连,网络性能的优劣直接影响企业的发展步伐。网络流量管理在企业网络运维中占据非常关键的地位。监控易一体化运维管理软件,凭借其强大的网络流量分析功能,为企业网络的稳定高效运行提供了有力保…...

IDEA+git将分支合并到主分支、IDEA合并分支
文章目录 一、合并分支二、可能遇到的问题2.1、代码冲突 开发过程中我们可能在开发分支(dev)中进行开发,等上线后将代码合并到主分支(master)中,本文讲解如何在IDEA中将dev分支的代码合并到master分支中。 一、合并分支 功能说明:将dev分支的…...
QML学习01(设置宽度、高度、坐标点、标题,信号与槽,键盘事件)
QML学习 1、前言2、QML3、QML和QWidget的区别3、QtQuick下的Windows应用4、总结 1、前言 记录一下QML学习的过程,方便自己日后回顾,也可以给有需要的人提供帮助。 2、QML QML是 Qt 框架中的一种声明式编程语言,专门用于快速设计和开发用户…...

uniapp+vue3中自动导入ref等依赖
前言: 在我们使用uni-appvue3创建项目,开发的过程中,老是需要导入我们的ref、onshow等,那么能不能自动导入,不用我们每个页面都写呢?是没问题的,这里让他的小帮手来帮你减轻负担:他就…...