123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399 |
- .. _doc_exporting_for_web:
- Exporting for the Web
- =====================
- .. seealso::
- This page describes how to export a Godot project to HTML5.
- If you're looking to compile editor or export template binaries from source instead,
- read :ref:`doc_compiling_for_web`.
- HTML5 export allows publishing games made in Godot Engine to the browser.
- This requires support for `WebAssembly
- <https://webassembly.org/>`__ and `WebGL 2.0 <https://www.khronos.org/webgl/>`__
- in the user's browser.
- .. attention::
- Projects written in C# using Godot 4 currently cannot be exported to the
- web. To use C# on web platforms, use Godot 3 instead.
- .. tip::
- Use the browser-integrated developer console, usually opened
- with :kbd:`F12` (:kbd:`Cmd + Option + I` on macOS), to view
- **debug information** like JavaScript, engine, and WebGL errors.
- .. seealso::
- See the
- `list of open issues on GitHub related to the web export <https://github.com/godotengine/godot/issues?q=is%3Aopen+is%3Aissue+label%3Aplatform%3Aweb>`__
- for a list of known bugs.
- Export file name
- ----------------
- We suggest users to export their Web projects with ``index.html`` as the file name.
- ``index.html`` is usually the default file loaded by web servers when accessing the
- parent directory, usually hiding the name of that file.
- .. attention::
- The Godot 4 Web export expects some files to be named the same name as the one set in the
- initial export. Some issues could occur if some exported files are renamed, including the
- main HTML file.
- WebGL version
- -------------
- Godot 4.0 and later can only target WebGL 2.0 (using the Compatibility rendering
- method). Forward+/Mobile are not supported on the web platform, as these
- rendering methods are designed around modern low-level graphics APIs. Godot
- currently does not support WebGPU, which is a prerequisite for allowing
- Forward+/Mobile to run on the web platform.
- See `Can I use WebGL 2.0 <https://caniuse.com/webgl2>`__ for a list of browser
- versions supporting WebGL 2.0. Note that Safari has several issues with WebGL
- 2.0 support that other browsers don't have, so we recommend using a
- Chromium-based browser or Firefox if possible.
- .. _doc_exporting_for_web_audio_playback:
- Audio playback
- --------------
- Since Godot 4.3, audio playback is done using the Web Audio API on the web
- platform. This **Sample** playback mode allows for low latency even when the
- project is exported without thread support, but it has several limitations:
- - AudioEffects are not supported.
- - :ref:`Reverberation and doppler <doc_audio_streams_reverb_buses>` effects are not supported.
- - Procedural audio generation is not supported.
- - Positional audio may not always work correctly depending on the node's properties.
- To use Godot's own audio playback system on the web platform, you can change the
- default playback mode using the **Audio > General > Default Playback Type.web**
- project setting, or change the **Playback Type** property to **Stream** on an
- :ref:`class_AudioStreamPlayer`, :ref:`class_AudioStreamPlayer2D` or
- :ref:`class_AudioStreamPlayer3D` node. This leads to increased latency
- (especially when thread support is disabled), but it allows the full suite
- of Godot's audio features to work.
- .. _doc_javascript_export_options:
- Export options
- --------------
- If a runnable web export template is available, a button appears between the
- *Stop scene* and *Play edited Scene* buttons in the editor to quickly open the
- game in the default browser for testing.
- If your project uses GDExtension **Extension Support** needs to be enabled.
- If you plan to use :ref:`VRAM compression <doc_importing_images>` make sure that
- **VRAM Texture Compression** is enabled for the targeted platforms (enabling
- both **For Desktop** and **For Mobile** will result in a bigger, but more
- compatible export).
- If a path to a **Custom HTML shell** file is given, it will be used instead of
- the default HTML page. See :ref:`doc_customizing_html5_shell`.
- **Head Include** is appended into the ``<head>`` element of the generated
- HTML page. This allows to, for example, load webfonts and third-party
- JavaScript APIs, include CSS, or run JavaScript code.
- .. important:: Each project must generate their own HTML file. On export,
- several text placeholders are replaced in the generated HTML
- file specifically for the given export options. Any direct
- modifications to that HTML file will be lost in future exports.
- To customize the generated file, use the **Custom HTML shell**
- option.
- .. _doc_exporting_for_web_thread_extension_support:
- Thread and extension support
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- If **Thread Support** is enabled, the exported project will be able to
- :ref:`make use of multithreading <doc_using_multiple_threads>` to improve
- performance. This also allows for low-latency audio playback
- when the playback type is set to **Stream** (instead of the default **Sample**
- that is used in web exports). Enabling this feature requires the use of
- cross-origin isolation headers, which are described in the
- :ref:`doc_exporting_for_web_serving_the_files` section below.
- If **Extensions Support** is enabled, :ref:`GDExtensions <doc_what_is_gdextension>`
- will be able to be loaded. Note that GDExtensions still need to be specifically
- compiled for the web platform to work. Like thread support, enabling this feature
- requires the use of cross-origin isolation headers.
- Exporting as a Progressive Web App (PWA)
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- If **Progressive Web App > Enable** is enabled, it will have several effects:
- - Configure high-resolution icons, a display mode and screen orientation. These
- are configured at the end of the Progressive Web App section in the export
- options. These options are used if the user adds the project to their device's
- homescreen, which is common on mobile platforms. This is also supported on
- desktop platforms, albeit in a more limited capacity.
- - Allow the project to be loaded without an Internet connection if it has been
- loaded at least once beforehand. This works thanks to the *service worker*
- that is installed when the project is first loaded in the user's browser. This
- service worker provides a local fallback when no Internet connection is
- available.
- - Note that web browsers can choose to evict the cached data if the user runs
- low on disk space, or if the user hasn't opened the project for a while.
- To ensure data is cached for a longer duration, the user can bookmark the page,
- or ideally add it to their device's home screen.
- - If the offline data is not available because it was evicted from the cache,
- you can configure an **Offline Page** that will be displayed in this case.
- The page must be in HTML format and will be saved on the client's machine
- the first time the project is loaded.
- - Ensure cross-origin isolation headers are always present, even if the web
- server hasn't been configured to send them. This allows exports with threads
- enabled to work when hosted on any website, even if there is no way for you to
- control the headers it sends.
- - This behavior can be disabled by unchecking **Enable Cross Origin Isolation Headers**
- in the Progressive Web App section.
- Limitations
- -----------
- For security and privacy reasons, many features that work effortlessly on
- native platforms are more complicated on the web platform. Following is a list
- of limitations you should be aware of when porting a Godot game to the web.
- .. _doc_javascript_secure_contexts:
- .. important:: Browser vendors are making more and more functionalities only
- available in `secure contexts <https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts>`_,
- this means that such features are only be available if the web
- page is served via a secure HTTPS connection (localhost is
- usually exempt from such requirement).
- Using cookies for data persistence
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Users must **allow cookies** (specifically IndexedDB) if persistence of the
- ``user://`` file system is desired. When playing a game presented in an
- ``iframe``, **third-party** cookies must also be enabled. Incognito/private
- browsing mode also prevents persistence.
- The method ``OS.is_userfs_persistent()`` can be used to check if the
- ``user://`` file system is persistent, but can give false positives in some
- cases.
- Background processing
- ~~~~~~~~~~~~~~~~~~~~~
- The project will be paused by the browser when the tab is no longer the active
- tab in the user's browser. This means functions such as ``_process()`` and
- ``_physics_process()`` will no longer run until the tab is made active again by
- the user (by switching back to the tab). This can cause networked games to
- disconnect if the user switches tabs for a long duration.
- This limitation does not apply to unfocused browser *windows*. Therefore, on the
- user's side, this can be worked around by running the project in a separate
- *window* instead of a separate tab.
- Full screen and mouse capture
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Browsers do not allow arbitrarily **entering full screen**. The same goes for
- **capturing the cursor**. Instead, these actions have to occur as a response to
- a JavaScript input event. In Godot, this means entering full screen from within
- a pressed input event callback such as ``_input`` or ``_unhandled_input``.
- Querying the :ref:`class_Input` singleton is not sufficient, the relevant
- input event must currently be active.
- For the same reason, the full screen project setting doesn't work unless the
- engine is started from within a valid input event handler. This requires
- :ref:`customization of the HTML page <doc_customizing_html5_shell>`.
- Audio
- ~~~~~
- Some browsers restrict autoplay for audio on websites. The easiest way around this limitation is to request the
- player to click, tap or press a key/button to enable audio, for instance when displaying a splash screen at the start of your game.
- .. seealso:: Google offers additional information about their `Web Audio autoplay
- policies <https://sites.google.com/a/chromium.org/dev/audio-video/autoplay>`__.
- Apple's Safari team also posted additional information about their `Auto-Play Policy Changes for macOS
- <https://webkit.org/blog/7734/auto-play-policy-changes-for-macos/>`__.
- .. warning:: Access to microphone requires a
- :ref:`secure context <doc_javascript_secure_contexts>`.
- Networking
- ~~~~~~~~~~
- .. UPDATE: Not implemented. When low-level networking is implemented, remove
- .. this paragraph.
- Low-level networking is not implemented due to lacking support in browsers.
- Currently, only :ref:`HTTP client <doc_http_client_class>`,
- :ref:`HTTP requests <doc_http_request_class>`,
- :ref:`WebSocket (client) <doc_websocket>` and :ref:`WebRTC <doc_webrtc>` are
- supported.
- The HTTP classes also have several restrictions on the HTML5 platform:
- - Accessing or changing the ``StreamPeer`` is not possible
- - Threaded/Blocking mode is not available
- - Cannot progress more than once per frame, so polling in a loop will freeze
- - No chunked responses
- - Host verification cannot be disabled
- - Subject to `same-origin policy <https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy>`__
- Clipboard
- ~~~~~~~~~
- Clipboard synchronization between engine and the operating system requires a
- browser supporting the `Clipboard API <https://developer.mozilla.org/en-US/docs/Web/API/Clipboard_API>`__,
- additionally, due to the API asynchronous nature might not be reliable when
- accessed from GDScript.
- .. warning:: Requires a :ref:`secure context <doc_javascript_secure_contexts>`.
- Gamepads
- ~~~~~~~~
- Gamepads will not be detected until one of their button is pressed. Gamepads
- might have the wrong mapping depending on the browser/OS/gamepad combination,
- sadly the `Gamepad API <https://developer.mozilla.org/en-US/docs/Web/API/Gamepad_API/Using_the_Gamepad_API>`__
- does not provide a reliable way to detect the gamepad information necessary
- to remap them based on model/vendor/OS due to privacy considerations.
- .. warning:: Requires a :ref:`secure context <doc_javascript_secure_contexts>`.
- Boot splash is not displayed
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- The default HTML page does not display the boot splash while loading. However,
- the image is exported as a PNG file, so :ref:`custom HTML pages <doc_customizing_html5_shell>`
- can display it.
- .. _doc_exporting_for_web_serving_the_files:
- Serving the files
- -----------------
- Exporting for the web generates several files to be served from a web server,
- including a default HTML page for presentation. A custom HTML file can be
- used, see :ref:`doc_customizing_html5_shell`.
- .. warning::
- If either :ref:`thread support or extension support <doc_exporting_for_web_thread_extension_support>`
- are enabled, the exported project will require
- `SharedArrayBuffer <https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer>`__.
- This requires a :ref:`secure context <doc_javascript_secure_contexts>`,
- while also requiring the following CORS headers to be set when serving the files:
- ::
- Cross-Origin-Opener-Policy: same-origin
- Cross-Origin-Embedder-Policy: require-corp
- If you don't control the web server or are unable to add response headers,
- check **Progressive Web App > Enable** in the export options. This applies
- a service worker-based workaround that allows the project to run by
- simulating the presence of these response headers. A secure context
- is still required in this case.
- If the client doesn't receive the required response headers or the service
- worker-based workaround is not applied, **the project will not run**.
- The generated ``.html`` file can be used as ``DirectoryIndex`` in Apache
- servers and can be renamed to e.g. ``index.html`` at any time. Its name is
- never depended on by default.
- The HTML page draws the game at maximum size within the browser window.
- This way, it can be inserted into an ``<iframe>`` with the game's size, as is
- common on most web game hosting sites.
- The other exported files are served as they are, next to the ``.html`` file,
- names unchanged. The ``.wasm`` file is a binary WebAssembly module implementing
- the engine. The ``.pck`` file is the Godot main pack containing your game. The
- ``.js`` file contains start-up code and is used by the ``.html`` file to access
- the engine. The ``.png`` file contains the boot splash image. It is not used in
- the default HTML page, but is included for
- :ref:`custom HTML pages <doc_customizing_html5_shell>`.
- The ``.pck`` file is binary, usually delivered with the MIME-type
- :mimetype:`application/octet-stream`. The ``.wasm`` file is delivered as
- :mimetype:`application/wasm`.
- .. warning::
- Delivering the WebAssembly module (``.wasm``) with a MIME-type
- other than :mimetype:`application/wasm` can prevent some start-up
- optimizations.
- Delivering the files with server-side compression is recommended especially for
- the ``.pck`` and ``.wasm`` files, which are usually large in size. The
- WebAssembly module compresses particularly well, down to around a quarter of its
- original size with gzip compression. Consider using Brotli precompression if
- supported on your web server for further file size savings.
- **Hosts that provide on-the-fly compression:** GitHub Pages (gzip)
- **Hosts that don't provide on-the-fly compression:** itch.io, GitLab Pages
- (`supports manual gzip precompression <https://webd97.de/post/gitlab-pages-compression/>`__)
- .. tip::
- The Godot repository includes a
- `Python script to host a local web server <https://raw.githubusercontent.com/godotengine/godot/master/platform/web/serve.py>`__.
- This script is intended for testing the web editor, but it can also be used to test exported projects.
- Save the linked script to a file called ``serve.py``, move this file to the
- folder containing the exported project's ``index.html``, then run the
- following command in a command prompt within the same folder:
- ::
- # You may need to replace `python` with `python3` on some platforms.
- python serve.py --root .
- On Windows, you can open a command prompt in the current folder by holding
- :kbd:`Shift` and right-clicking on empty space in Windows Explorer, then
- choosing **Open PowerShell window here**.
- This will serve the contents of the current folder and open the default web
- browser automatically.
- Note that for production use cases, this Python-based web server should not
- be used. Instead, you should use an established web server such as Apache or
- nginx.
- Interacting with the browser and JavaScript
- -------------------------------------------
- See the :ref:`dedicated page <doc_web_javascript_bridge>` on how to interact
- with JavaScript and access some unique Web browser features.
- Environment variables
- ---------------------
- You can use the following environment variables to set export options outside of
- the editor. During the export process, these override the values that you set in
- the export menu.
- .. list-table:: HTML5 export environment variables
- :header-rows: 1
- * - Export option
- - Environment variable
- * - Encryption / Encryption Key
- - ``GODOT_SCRIPT_ENCRYPTION_KEY``
|