Una pequeña biblioteca de vistas web multiplataforma para C/C++ para crear GUI multiplataforma modernas.
El objetivo del proyecto es crear una capa de abstracción de interfaz de usuario HTML5 común para las plataformas más utilizadas.
Admite enlaces de JavaScript bidireccionales (para llamar a JavaScript desde C/C++ y para llamar a C/C++ desde JavaScript).
Nota
Se ha movido el enlace de idioma para Go. Las versiones <= 0.1.1 están disponibles en este repositorio.
Plataforma | Tecnologías |
---|---|
linux | GTK, WebKitGTK |
macos | Cacao, WebKit |
ventanas | API de Windows, WebView2 |
La documentación más actualizada está directamente en el código fuente. Mejorar la documentación es un esfuerzo continuo y usted es más que bienvenido a contribuir.
Su compilador debe admitir como mínimo C++ 11, excepto para plataformas que requieren una versión más moderna.
Este proyecto utiliza CMake y Ninja y, aunque se recomiendan para su comodidad, estas herramientas no son necesarias para utilizar la biblioteca.
Las bibliotecas GTK y WebKitGTK son necesarias para el desarrollo y la distribución. Debe verificar sus repositorios de paquetes con respecto a qué paquetes instalar.
apt install libgtk-4-dev libwebkitgtk-6.0-dev
apt install libgtk-4-1 libwebkitgtk-6.0-4
apt install libgtk-3-dev libwebkit2gtk-4.1-dev
apt install libgtk-3-0 libwebkit2gtk-4.1-0
apt install libgtk-3-dev libwebkit2gtk-4.0-dev
apt install libgtk-3-0 libwebkit2gtk-4.0-37
dnf install gtk4-devel webkitgtk6.0-devel
dnf install gtk4 webkitgtk6.0
dnf install gtk3-devel webkit2gtk4.1-devel
dnf install gtk3 webkit2gtk4.1
dnf install gtk3-devel webkit2gtk4.0-devel
dnf install gtk3 webkit2gtk4.0
pkg install webkit2-gtk4
pkg install webkit2-gtk3
pkg-config
con --cflags
y --libs
para obtener las opciones del compilador/enlazador para uno de estos conjuntos de módulos:gtk4 webkitgtk-6.0
gtk+-3.0 webkit2gtk-4.1
gtk+-3.0 webkit2gtk-4.0
dl
WebKit
dl
advapi32 ole32 shell32 shlwapi user32 version
wxallowed
(ver mount(8)) a su fstab para evitar la protección de memoria W^X para su ejecutable. Comprueba si funciona sin desactivar primero esta función de seguridad.Su compilador debe ser compatible con C++14 y recomendamos vincularlo con un SDK de Windows 10 actualizado.
Para Visual C++ recomendamos Visual Studio 2022 o posterior. Existen algunos requisitos al utilizar MinGW-w64.
Los desarrolladores y usuarios finales deben tener instalado el tiempo de ejecución WebView2 en su sistema para cualquier versión de Windows anterior a Windows 11.
Si es desarrollador de este proyecto, vaya a la sección de desarrollo.
Tendrá una aplicación funcional, pero le recomendamos que explore los ejemplos disponibles.
Cree los siguientes archivos en un nuevo directorio:
.gitignore
:
# Build artifacts
/build
CMakeLists.txt
:
cmake_minimum_required ( VERSION 3.16)
project (example LANGUAGES CXX)
set ( CMAKE_RUNTIME_OUTPUT_DIRECTORY " ${CMAKE_BINARY_DIR} /bin" )
set ( CMAKE_LIBRARY_OUTPUT_DIRECTORY " ${CMAKE_BINARY_DIR} /lib" )
set ( CMAKE_ARCHIVE_OUTPUT_DIRECTORY " ${CMAKE_BINARY_DIR} /lib" )
include (FetchContent)
FetchContent_Declare(
webview
GIT_REPOSITORY https://github.com/webview/webview
GIT_TAG 0.12.0)
FetchContent_MakeAvailable(webview)
add_executable (example WIN32 )
target_sources (example PRIVATE main.cc)
target_link_libraries (example PRIVATE webview::core)
main.cc
:
# include " webview/webview.h "
# include < iostream >
# ifdef _WIN32
int WINAPI WinMain (HINSTANCE /* hInst */ , HINSTANCE /* hPrevInst */ ,
LPSTR /* lpCmdLine */ , int /* nCmdShow */ ) {
# else
int main () {
#endif
try {
webview::webview w ( false , nullptr );
w. set_title ( " Basic Example " );
w. set_size ( 480 , 320 , WEBVIEW_HINT_NONE);
w. set_html ( " Thanks for using webview! " );
w. run ();
} catch ( const webview:: exception &e) {
std::cerr << e. what () << ' n ' ;
return 1 ;
}
return 0 ;
}
CMakeLists.txt
:
cmake_minimum_required ( VERSION 3.16)
project (example LANGUAGES C CXX)
set ( CMAKE_RUNTIME_OUTPUT_DIRECTORY " ${CMAKE_BINARY_DIR} /bin" )
set ( CMAKE_LIBRARY_OUTPUT_DIRECTORY " ${CMAKE_BINARY_DIR} /lib" )
set ( CMAKE_ARCHIVE_OUTPUT_DIRECTORY " ${CMAKE_BINARY_DIR} /lib" )
include (FetchContent)
FetchContent_Declare(
webview
GIT_REPOSITORY https://github.com/webview/webview
GIT_TAG 0.12.0)
FetchContent_MakeAvailable(webview)
add_executable (example WIN32 )
target_sources (example PRIVATE main.c)
target_link_libraries (example PRIVATE webview::core_static)
main.c
:
# include " webview/webview.h "
# include < stddef.h >
# ifdef _WIN32
# include < windows.h >
# endif
# ifdef _WIN32
int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine,
int nCmdShow) {
( void )hInst;
( void )hPrevInst;
( void )lpCmdLine;
( void )nCmdShow;
# else
int main ( void ) {
#endif
webview_t w = webview_create ( 0 , NULL );
webview_set_title (w, " Basic Example " );
webview_set_size (w, 480 , 320 , WEBVIEW_HINT_NONE);
webview_set_html (w, " Thanks for using webview! " );
webview_run (w);
webview_destroy (w);
return 0 ;
}
Construya el proyecto:
cmake -G Ninja -B build -S . -D CMAKE_BUILD_TYPE=Release
cmake --build build
Busque el ejecutable en el directorio build/bin
.
Se puede crear una biblioteca fusionada al crear el proyecto usando CMake, o se puede invocar directamente el script amalgamate.py
.
Esto último se describe a continuación.
python3 scripts/amalgamate.py --output webview_amalgamation.h core/include/webview/webview.h
Consulte python3 scripts/amalgamate.py --help
para conocer el uso de scripts.
A continuación se muestra un ejemplo para invocar compiladores tipo GCC/Clang directamente. Utilice el archivo main.cc
del ejemplo anterior.
Coloque el encabezado webview.h
fusionado o todos los archivos individuales en libs/webview
y WebView2.h
de MS WebView2 en libs
.
Construya el proyecto en la plataforma elegida.
c++ main.cc -O2 --std=c++11 -Ilibs -framework WebKit -ldl -o example
c++ main.cc -O2 --std=c++11 -Ilibs $(pkg-config --cflags --libs gtk+-3.0 webkit2gtk-4.1) -ldl -o example
c++ main.cc -O2 --std=c++14 -static -mwindows -Ilibs -ladvapi32 -lole32 -lshell32 -lshlwapi -luser32 -lversion -o example
Los siguientes objetivos de CMake están disponibles:
Nombre | Descripción |
---|---|
webview::core | Encabezados para C++. |
webview::core_shared | Biblioteca compartida para C. |
webview::core_static | Biblioteca estática para C. |
Objetivos especiales para controles bajo demanda y tareas relacionadas:
Nombre | Descripción |
---|---|
webview_format_check | Verifique archivos con formato clang. |
webview_reformat | Vuelva a formatear archivos con formato clang. |
Las siguientes opciones booleanas se pueden utilizar al crear el proyecto de vista web de forma independiente o al crearlo como parte de su proyecto (por ejemplo, con FetchContent).
Opción | Descripción |
---|---|
WEBVIEW_BUILD | Habilitar edificio |
WEBVIEW_BUILD_AMALGAMATION | Construir una biblioteca fusionada |
WEBVIEW_BUILD_DOCS | Documentación de compilación |
WEBVIEW_BUILD_EXAMPLES | Ejemplos de construcción |
WEBVIEW_BUILD_SHARED_LIBRARY | Construir bibliotecas compartidas |
WEBVIEW_BUILD_STATIC_LIBRARY | Construir bibliotecas estáticas |
WEBVIEW_BUILD_TESTS | Pruebas de compilación |
WEBVIEW_ENABLE_CHECKS | Habilitar cheques |
WEBVIEW_ENABLE_CLANG_FORMAT | Habilitar formato clang |
WEBVIEW_ENABLE_CLANG_TIDY | Habilitar clang-tidy |
WEBVIEW_ENABLE_PACKAGING | Habilitar embalaje |
WEBVIEW_INSTALL_DOCS | Instalar documentación |
WEBVIEW_INSTALL_TARGETS | Instalar objetivos |
WEBVIEW_IS_CI | Inicializado por la variable de entorno CI |
WEBVIEW_PACKAGE_AMALGAMATION | Biblioteca fusionada de paquetes |
WEBVIEW_PACKAGE_DOCS | Documentación del paquete |
WEBVIEW_PACKAGE_HEADERS | Encabezados de paquetes |
WEBVIEW_PACKAGE_LIB | Bibliotecas compiladas de paquetes |
WEBVIEW_STRICT_CHECKS | Hacer controles estrictos |
WEBVIEW_STRICT_CLANG_FORMAT | Hacer que la verificación del formato clang sea estricta |
WEBVIEW_STRICT_CLANG_TIDY | Haga que el control de limpieza sea estricto |
WEBVIEW_USE_COMPAT_MINGW | Utilice el asistente de compatibilidad para MinGW |
WEBVIEW_USE_STATIC_MSVC_RUNTIME | Utilice la biblioteca de tiempo de ejecución estática (MSVC) |
Nota
Las comprobaciones están habilitadas de forma predeterminada, pero no se aplican de forma predeterminada para el desarrollo local (controlado por la opción WEBVIEW_IS_CI
).
Opciones no booleanas:
Opción | Descripción |
---|---|
WEBVIEW_CLANG_FORMAT_EXE | Ruta del ejecutable clang-format . |
WEBVIEW_CLANG_TIDY_EXE | Ruta del ejecutable clang-tidy . |
Estas opciones se pueden utilizar cuando se utiliza el paquete webview CMake.
Opción | Descripción |
---|---|
WEBVIEW_WEBKITGTK_API | API WebKitGTK para interactuar con, por ejemplo, 6.0 , 4.1 (recomendado) o 4.0 . Esto también decidirá automáticamente la versión GTK. Utiliza la última API recomendada de forma predeterminada, si está disponible, o la última API conocida y disponible. Tenga en cuenta que puede haber diferencias importantes entre las versiones de API que pueden afectar la disponibilidad de las funciones. Consulte la documentación de la API de webview para obtener detalles sobre la disponibilidad de funciones. |
Opción | Descripción |
---|---|
WEBVIEW_MSWEBVIEW2_VERSION | Versión de MS WebView2, por ejemplo, 1.0.1150.38 . |
WEBVIEW_USE_BUILTIN_MSWEBVIEW2 | Utilice MS WebView2 integrado. |
Estas opciones se pueden especificar como macros de preprocesador para modificar la compilación, pero no son necesarias cuando se usa CMake.
Nombre | Descripción |
---|---|
WEBVIEW_API | Controla el enlace de la API de C, la visibilidad de los símbolos y si se trata de una biblioteca compartida. De forma predeterminada, esto está inline para C++ y extern para C. |
WEBVIEW_BUILD_SHARED | Modifica WEBVIEW_API para crear una biblioteca compartida. |
WEBVIEW_SHARED | Modifica WEBVIEW_API para usar una biblioteca compartida. |
WEBVIEW_STATIC | Modifica WEBVIEW_API para crear o usar una biblioteca estática. |
Nombre | Descripción |
---|---|
WEBVIEW_GTK | Compile el backend GTK/WebKitGTK. |
WEBVIEW_COCOA | Compile el backend de Cocoa/WebKit. |
WEBVIEW_EDGE | Compile el backend de Win32/WebView2. |
Opción | Descripción |
---|---|
WEBVIEW_MSWEBVIEW2_BUILTIN_IMPL | Habilita ( 1 ) o deshabilita ( 0 ) la implementación integrada del cargador WebView2. Habilitar esto evita la necesidad de WebView2Loader.dll pero si la DLL está presente, entonces la DLL tiene prioridad. Esta opción está habilitada de forma predeterminada. |
WEBVIEW_MSWEBVIEW2_EXPLICIT_LINK | Habilita ( 1 ) o deshabilita ( 0 ) el enlace explícito de WebView2Loader.dll . Habilitar esto evita la necesidad de importar bibliotecas ( *.lib ). Esta opción está habilitada de forma predeterminada si WEBVIEW_MSWEBVIEW2_BUILTIN_IMPL está habilitado. |
Para crear esta biblioteca usando MinGW-w64 en Windows, debe ser compatible con C++14 y tener un SDK de Windows actualizado.
Distribuciones que se sabe que son compatibles:
Vincular la parte del cargador WebView2 del SDK de Microsoft WebView2 no es un requisito estricto cuando se utiliza nuestra biblioteca webview, y tampoco lo es distribuir WebView2Loader.dll
con su aplicación.
Sin embargo, si WebView2Loader.dll
se puede cargar en tiempo de ejecución, por ejemplo desde el directorio del ejecutable, entonces se utilizará; de lo contrario, se utilizará nuestra implementación minimalista.
Si desea utilizar el cargador oficial, recuerde distribuirlo junto con su aplicación a menos que la vincule estáticamente. Vincularlo estáticamente es posible con Visual C++ pero no con MinGW-w64.
Estas son algunas de las diferencias notables entre nuestra implementación del cargador y la implementación oficial:
WEBVIEW2_BROWSER_EXECUTABLE_FOLDER
.Se pueden utilizar opciones de personalización para cambiar la forma en que la biblioteca integra el cargador WebView2.
Este proyecto utiliza el sistema de compilación CMake.
Además de las dependencias mencionadas anteriormente en este documento para desarrollar con la biblioteca webview, las siguientes se utilizan durante el desarrollo de la biblioteca webview.
clang-format
clang-tidy
cmake -G " Ninja Multi-Config " -B build -S .
cmake --build build --config CONFIG
Reemplace CONFIG
con uno de Debug
, Release
o Profile
. Utilice Profile
para habilitar la cobertura de código (GCC/Clang).
Ejecutar pruebas:
ctest --test-dir build --build-config CONFIG
Generar informe de cobertura de prueba:
gcovr
Busque el informe de cobertura en build/coverage
.
Ejecute esto después de crear las configuraciones Debug
y Release
del proyecto:
cd build
cpack -G External -C " Debug;Release " --config CPackConfig.cmake
Consulte los archivos de la cadena de herramientas de CMake en el directorio cmake/toolchains
.
Por ejemplo, esto apunta a Windows x64 en Linux con subprocesos POSIX:
cmake -G " Ninja Multi-Config " -B build -S . -D CMAKE_TOOLCHAIN_FILE=cmake/toolchains/x86_64-w64-mingw32.cmake -D WEBVIEW_TOOLCHAIN_EXECUTABLE_SUFFIX=-posix
cmake --build build --config CONFIG
Dado que un motor de navegador no es un navegador web completo, es posible que no admita todas las funciones que puede esperar de un navegador. Si descubre que una función no funciona como se esperaba, consulte la documentación del motor del navegador y abra un problema si cree que la biblioteca debería admitirla.
Por ejemplo, la biblioteca no intenta admitir funciones de interacción del usuario como alert()
, confirm()
y prompt()
y otras funciones no esenciales como console.log()
.
Idioma | Proyecto |
---|---|
ada | elchampagne/webview-ada |
Bollo | tr1ckydev/webview-bun |
DO# | vista web/vista web_csharp |
C3 | elchampagne/webview-c3 |
Cristal | naqvis/vista web |
D | thechampagne/webview-d, ronnie-w/webviewd |
Deno | vista web/vista web_deno |
Ir | vista web/vista web_go |
Puerto | EricLendvai/Harbour_WebView |
Haskell | lettier/webviewhs |
janet | janet-lang/webview |
Java | vista web/vista web_java |
Kotlin | Reisender de invierno/webviewko |
nim | oskca/webview, neroist/webview |
Nodo.js | Winterreisender/webview-nodejs |
Odín | thechampagne/webview-odin |
Pascal | PierceNg/fpwebview |
Pitón | congzhangzh/webview_python,zserge/webview-python |
PHP | 0 horas/php-webview |
Rubí | Maaarcocr/webview_ruby |
Óxido | Boscop/vista web |
Rápido | jakenvac/SwiftWebview |
V | malisipi/mui, ttytm/webview |
Zig | elchampagne/webview-zig |
Si desea agregar enlaces a la lista, no dude en enviar una solicitud de extracción o abrir un problema.
Puede generar enlaces para la biblioteca usted mismo utilizando la interfaz SWIG incluida ( webview.i
).
Aquí hay algunos ejemplos para comenzar. Las líneas de comando de estilo Unix se utilizan para mayor concisión.
mkdir -p build/bindings/{python,csharp,java,ruby}
swig -c++ -python -outdir build/bindings/python -o build/bindings/python/python_wrap.cpp webview.i
swig -c++ -csharp -outdir build/bindings/csharp -o build/bindings/csharp/csharp_wrap.cpp webview.i
swig -c++ -java -outdir build/bindings/java -o build/bindings/java/java_wrap.cpp webview.i
swig -c++ -ruby -outdir build/bindings/ruby -o build/bindings/ruby/ruby_wrap.cpp webview.i
El código se distribuye bajo licencia MIT, siéntase libre de usarlo también en sus proyectos propietarios.