Skip to content

Commit

Permalink
[Frontend] Add section for using JSX with Vue.js
Browse files Browse the repository at this point in the history
  • Loading branch information
Kocal authored and javiereguiluz committed Apr 11, 2019
1 parent dc35a22 commit 916ad73
Showing 1 changed file with 111 additions and 0 deletions.
111 changes: 111 additions & 0 deletions frontend/encore/vuejs.rst
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,118 @@ updated styles still requires a page refresh.

See :doc:`/frontend/encore/dev-server` for more details.

JSX Support
-----------

You can enable `JSX with Vue.js`_ by configuring the 2nd parameter of the ``.enableVueLoader()`` method:

.. code-block:: diff
// webpack.config.js
// ...
Encore
// ...
.addEntry('main', './assets/main.js')
- .enableVueLoader()
+ .enableVueLoader(() => {}, {
+ useJsx: true
+ })
;
Next, run or restart Encore. When you do, you will see an error message helping you
install any missing dependencies. After running that command and restarting
Encore, you're done!

Your ``.jsx`` files will now be transformed through ``@vue/babel-preset-jsx``.

Using styles
~~~~~~~~~~~~

You can't use ``<style>`` in ``.jsx`` files.
As a workaround, you can import ``.css``, ``.scss``, etc, files manually:

.. code-block:: javascript
// App.jsx
import './App.css'
export default {
name: 'App',
render() {
return (
<div>
...
</div>
)
}
}
.. note::

Importing styles this way make them global.
See the next section for scoping them to your component.

Using Scoped Styles
~~~~~~~~~~~~~~~~~~~

You also can't use `Scoped Styles`_ (``<style scoped>``) in ``.jsx`` files.
As a workaround, you can use `CSS Modules`_ by suffixing import paths with ``?module``:

.. code-block:: javascript
// Component.jsx
import styles from './Component.css?module' // suffix with "?module"
export default {
name: 'Component',
render() {
return (
<div>
<h1 class={styles.title}>
Hello World
</h1>
</div>
)
}
}
.. code-block:: css
/* Component.css */
.title {
color: red
}
The output will be something like ``<h1 class="h1_a3dKp">Hello World</h1>``.

Using images
~~~~~~~~~~~~

You can't use ``<img src="./image.png">`` in ``.jsx`` files.
As a workaround, you can import them with ``require()`` function:

.. code-block:: javascript
export default {
name: 'Component',
render() {
return (
<div>
<img src={require("./image.png")} />
</div>
)
}
}
.. _`babel-preset-react`: https://babeljs.io/docs/plugins/preset-react/
.. _`Vue.js`: https://vuejs.org/
.. _`vue-loader options`: https://vue-loader.vuejs.org/options.html
.. _`Encore's index.js file`: https://github.com/symfony/webpack-encore/blob/master/index.js
.. _`JSX with Vue.js`: https://github.com/vuejs/jsx
.. _`Scoped Styles`: https://vue-loader.vuejs.org/guide/scoped-css.html
.. _`CSS Modules`: https://github.com/css-modules/css-modules

0 comments on commit 916ad73

Please sign in to comment.