Skip to content

Encore: add guide to use Encore in a virtual machine #11422

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions frontend.rst
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ Guides
* :doc:`webpack-dev-server and Hot Module Replacement (HMR) </frontend/encore/dev-server>`
* :doc:`Adding custom loaders & plugins </frontend/encore/custom-loaders-plugins>`
* :doc:`Advanced Webpack Configuration </frontend/encore/advanced-config>`
* :doc:`Using Encore in a Virtual Machine </frontend/encore/virtual-machine>`

Issues & Questions
..................
Expand Down
13 changes: 0 additions & 13 deletions frontend/encore/dev-server.rst
Original file line number Diff line number Diff line change
Expand Up @@ -26,19 +26,6 @@ by the normal `webpack-dev-server`_. For example:

This will start a server at ``https://localhost:9000``.

Using dev-server inside a VM
----------------------------

If you're using ``dev-server`` from inside a virtual machine, then you'll need
to bind to all IP addresses and allow any host to access the server:

.. code-block:: terminal

$ ./node_modules/.bin/encore dev-server --host 0.0.0.0 --disable-host-check

You can now access the dev-server using the IP address to your virtual machine on
port 8080 - e.g. http://192.168.1.1:8080.

Hot Module Replacement HMR
--------------------------

Expand Down
106 changes: 106 additions & 0 deletions frontend/encore/virtual-machine.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
Using Encore in a Virtual Machine
=================================

You may encounter some issues when using Encore in a virtual machine, like VirtualBox or VMWare.

Fix watching issues
-------------------

When using a virtual machine, your project root directory is shared with the virtual machine with `NFS`_.
This is really useful, but it introduces some issues with files watching.

You must enable `polling`_ option to make it works:

.. code-block:: javascript

// webpack.config.js

// ...

// will be applied for `encore dev --watch` and `encore dev-server` commands
Encore.configureWatchOptions(watchOptions => {
watchOptions.poll = 250; // check for changes every 250 ms
});

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe also add a note here about the CLI equivalent (--watch-poll)?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep why not, but it means that the user will have to pass --watch-poll two times in its package.json 😕

Fix development server
----------------------

Configure public path
~~~~~~~~~~~~~~~~~~~~~

.. note::

You can skip this sub-section if your app is running on ``http://localhost``
and not a custom local domain-name like ``http://app.vm``.

When running the development server, you will probably face the following errors in the web console:

.. code-block:: text

GET http://localhost:8080/build/vendors~app.css net::ERR_CONNECTION_REFUSED
GET http://localhost:8080/build/runtime.js net::ERR_CONNECTION_REFUSED
...

If your Symfony application is running on ``http://app.vm``, you must configure the public path explicitly:

.. code-block:: javascript

// webpack.config.js

// ...

if (Encore.isDevServer()) {
Encore
// the default port is "8080", you can change it with the argument "--port"
.setPublicPath('http://app.vm:8080/build/')
// public path is absolute, we must define the manifest key prefix too
.setManifestKeyPrefix('build/');
}

After restarting Encore and reloading your web page, you will probably face different issues:

.. code-block:: text

GET http://app.vm:8080/build/vendors~app.css net::ERR_CONNECTION_REFUSED
GET http://app.vm:8080/build/runtime.js net::ERR_CONNECTION_REFUSED

Encore understood our modification but it's still not working. There is still two things to do.

Allow external access
~~~~~~~~~~~~~~~~~~~~~

You must configure how you run the `webpack-dev-server`_.
This can easily be done in your ``package.json`` by adding ``--host 0.0.0.0`` argument:

.. code-block:: diff

{
...
"scripts": {
- "dev-server": "encore dev-server",
+ "dev-server": "encore dev-server --host 0.0.0.0",
...
}
}


Fix "Invalid Host header" issue
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Webpack will respond ``Invalid Host header`` when trying to access files from the dev-server.
To fix this, add the argument ``--disable-host-check``:

.. code-block:: diff

{
...
"scripts": {
- "dev-server": "encore dev-server --host 0.0.0.0",
+ "dev-server": "encore dev-server --host 0.0.0.0 --disable-host-check",
...
}
}

.. _`NFS`: https://en.wikipedia.org/wiki/Network_File_System
.. _`polling`: https://webpack.js.org/configuration/watch/#watchoptionspoll
.. _`webpack-dev-server`: https://webpack.js.org/configuration/dev-server/