{"componentChunkName":"component---gatsby-theme-teklog-src-templates-post-tsx","path":"/how-to-replace-vue-js-with-react-in-laravel-5-4","result":{"data":{"site":{"siteMetadata":{"siteUrl":"https://blog.tekmi.nl","author":{"name":"Teklog","avatar":"/img/tekmi-icon.svg"}}},"blogPost":{"frontmatter":{"title":"How to replace Vue.js with React in Laravel 5.4","slug":"how-to-replace-vue-js-with-react-in-laravel-5-4","series":null,"date":"2017-07-02","datePretty":"02 July, 2017","coverImage":{"childImageSharp":{"fixed":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAIEAwX/xAAUAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHRpVS85on/xAAaEAACAgMAAAAAAAAAAAAAAAAAEgECAxEi/9oACAEBAAEFApxCaEkl6nQ1z//EABURAQEAAAAAAAAAAAAAAAAAAAAS/9oACAEDAQE/AYQ//8QAFREBAQAAAAAAAAAAAAAAAAAAABP/2gAIAQIBAT8Boo//xAAcEAABBAMBAAAAAAAAAAAAAAAAAQIxMhASkSH/2gAIAQEABj8C8UbrOJXpZS7un//EABwQAQADAAIDAAAAAAAAAAAAAAEAESExUUFxgf/aAAgBAQABPyHQsfZECijO3WEAOqHz0ONiNX8I/9oADAMBAAIAAwAAABDnH//EABcRAAMBAAAAAAAAAAAAAAAAAAABEVH/2gAIAQMBAT8Qbl6f/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAERUf/aAAgBAgEBPxBKTh//xAAcEAEAAwACAwAAAAAAAAAAAAABABEhMXFBYbH/2gAIAQEAAT8QN0g3IHuW4XlpFfZLdY2quwhVWm0qA5rUTw6gWkl+D5P/2Q==","width":1000,"height":750,"src":"/static/9de6c77db58082794446544c34cd5bf1/a7715/cloudsFieldTree.jpg","srcSet":"/static/9de6c77db58082794446544c34cd5bf1/a7715/cloudsFieldTree.jpg 1x"}}},"author":null,"authorAvatar":null},"timeToRead":3,"excerpt":"Introduction As you probably experienced, Laravel 5.4 comes with Vue.js bundled and bootstrapped. For some developers it is equivalent of Laravel…","html":"<h2 id=\"introduction\" style=\"position:relative;\"><a href=\"#introduction\" aria-label=\"introduction permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Introduction</h2>\n<p>As you probably experienced, Laravel 5.4 comes with Vue.js bundled and bootstrapped. For some developers it is equivalent of Laravel being coupled with Vue.js in some way. Hopefully it's not the case. Laravel is completely agnostic when it come to JS frameworks and you are free to choose whichever you prefer.</p>\n<p>Keep in mind though that Laravel community somehow fell in love with Vue.js, what is indirectly proven by following facts.</p>\n<ul>\n<li>Upcoming conferences <a href=\"http://laracon.us/#meet-speakers\">Laracon US</a> and <a href=\"https://laracon.eu/2017/speakers/\">Laracon EU</a> will host Evan You as a speaker, which is creator of Vue.js.</li>\n<li>\n<p>Jeffrey Way, creator of Laracasts, has tons of great videos about Vue.js, including</p>\n<ul>\n<li><a href=\"https://laracasts.com/series/learn-vue-2-step-by-step\">Learn Vue 2: Step By Step</a></li>\n<li><a href=\"https://laracasts.com/series/learning-vue-step-by-step\">Learning Vue 1.0: Step By Step</a></li>\n<li><a href=\"https://laracasts.com/series/learning-vuejs\">The Vast World of Vue.js 0.12</a></li>\n</ul>\n</li>\n<li>\n<p>Taylor Otwell, creator of Laravel, quite often reaches to Vue.js, what is visible in</p>\n<ul>\n<li><a href=\"https://laravel.com/docs/5.4/passport#frontend-quickstart\">Laravel Passport</a></li>\n<li><a href=\"https://spark.laravel.com/docs/4.0/adding-registration-fields#extending-the-javascript\">Laravel Spark</a></li>\n</ul>\n</li>\n</ul>\n<p>The good news is <a href=\"https://laravel-news.com/frontend-presets\">Laravel 5.5 will use frontend presets</a>, allowing to remove not only Vue.js, but also Bootstrap with ease. Angular lovers must still use my method - unfortunately no preset for them on the horizon.</p>\n<h2 id=\"assumptions\" style=\"position:relative;\"><a href=\"#assumptions\" aria-label=\"assumptions permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Assumptions</h2>\n<ul>\n<li>npm is installed</li>\n<li>php and composer are installed</li>\n<li>laravel command is available</li>\n</ul>\n<h2 id=\"solution\" style=\"position:relative;\"><a href=\"#solution\" aria-label=\"solution permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Solution</h2>\n<p>Bootstrap new Laravel project</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">laravel new laravel-with-react\n<span class=\"token builtin class-name\">cd</span> laravel-with-react</code></pre></div>\n<p>Replace Vue.js with React inside <strong>package.json</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">\"devDependencies\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">\"axios\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"^0.15.3\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"bootstrap-sass\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"^3.3.7\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"cross-env\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"^3.2.3\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"jquery\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"^3.1.1\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"laravel-mix\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"0.*\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"lodash\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"^4.17.4\"</span><span class=\"token punctuation\">,</span>\n\n    <span class=\"token property\">\"react\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"^15.5.4\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"react-dom\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"^15.5.4\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"babel-preset-react\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"^6.24.1\"</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Update Laravel mix configuration in <strong>webpack.mix.js</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">mix<span class=\"token punctuation\">.</span><span class=\"token function\">react</span><span class=\"token punctuation\">(</span><span class=\"token string\">'resources/assets/js/app.js'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'public/js'</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Clean up <strong>resources/assets/js/app.js</strong> file</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./bootstrap'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./components/App'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Remove Example.vue file and create <strong>resources/assets/js/components/App.js</strong> file.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">import</span> React<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> Component <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> ReactDOM <span class=\"token keyword\">from</span> <span class=\"token string\">'react-dom'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">App</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Component</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>h1</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">App</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>h1</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>document<span class=\"token punctuation\">.</span><span class=\"token function\">getElementById</span><span class=\"token punctuation\">(</span><span class=\"token string\">'app'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  ReactDOM<span class=\"token punctuation\">.</span><span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">App</span></span><span class=\"token punctuation\">/></span></span><span class=\"token punctuation\">,</span> document<span class=\"token punctuation\">.</span><span class=\"token function\">getElementById</span><span class=\"token punctuation\">(</span><span class=\"token string\">'app'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Update NPM package list and compile your assets</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> update\n<span class=\"token function\">npm</span> run dev</code></pre></div>\n<p>Create HTML element with <em>app</em> id and make sure <em>app.js</em> script is loaded inside <strong>resources/views/welcome.blade.php</strong> file.</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">id</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>app<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>{{ mix('js/app.js') }}<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token script\"></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p>That's all there is to it. Enjoy React.</p>\n<h2 id=\"summary\" style=\"position:relative;\"><a href=\"#summary\" aria-label=\"summary permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Summary</h2>\n<p>If needed, you can try to replace Vue with other JavaScript frameworks, like Ember or Angular. Since <a href=\"https://github.com/JeffreyWay/laravel-mix\">Laravel Mix</a> covers versatile configurations thanks to Webpack module bundler, the process should go smoothly.\nIf not, you may choose to write your own custom Webpack configuration or simply report an issue in <a href=\"https://github.com/JeffreyWay/laravel-mix/issues\">Laravel Mix</a> repository.</p>"}},"pageContext":{"postId":"69880bb1-a29c-56b9-9f38-c6d896aabadc","slug":"how-to-replace-vue-js-with-react-in-laravel-5-4"}}}