Using Vue CLI 3 with a Coldbox Application
TL;DR
The Vue CLI is a great tool for developing Vue.js applications but I wanted to see how it could be integrated into an application with a CFML/Coldbox back-end. I think the key to doing this is to use the Webpack Development Server proxy
setting to proxy requests to the CFML back-end application. I also adjusted the front-end and back-end routing to work well together. I created this Github repository that contains a simple Vue.js Single-Page Application (SPA) with a Coldbox back-end.
Introduction
I recently took this Udemy Course on Vue.js. I learned a lot from the course and would recommend it to anyone interested in learning Vue.js. As the course progressed into more advanced exercises and projects the instructor had me use the Vue CLI to scaffold and run my Vue.js applications. I liked how easy it was to use. I could easily run a built-in webpack development server which does something called Hot Module Replacement. Basically, this means that you can see your changes in real time without needing to reload the application. It is just as easy to build a minified version for production.
I have been wanting to try using the Vue CLI to develop a Vue.js Single-Page Application(SPA) with a Coldbox back-end. I thought I would document my steps here for myself and maybe it will help someone else too.
Coldbox REST API
To start I will use CommandBox create a Coldbox application using the REST template.
coldbox create app name = "My App" skeleton=rest
I will start the CommandBox server and run it on port 3000.
server start port=3000 rewritesEnable=true
Vue CLI Installation
The course I mention uses Vue CLI v2 but since Vue CLI v3 was recently released I decided to use that. Here is the command to install it globally.
npm install @vue/cli -g
Generate The Vue.js Application
I put the Vue.js application in a directory called client-app
. I kept all defaults when prompted to select options. The --git false
flag will tell Vue CLI to not initiate a Git repository.
vue create client-app --git false
This will generate the base Vue.js app. You can see it running by doing this.
cd client-app
npm run serve
Vue.js Plugins
Since this is a SPA I will use the Vue.js router. I can add it using this command.
vue add router
I plan to use Vuex for state management in this application so I add that as well.
vue add vuex
I added Axios for communicating with the backend API.
vue add axios
Finally, I add Vuetify which is a Material Design component library for Vue.js. I just accept all the default options for the generator.
vue add vuetify
Vue CLI Config
Asset Directory
You can create a file named vue.config.js
in the client-app directory. This file will contain a Javascript object with the configuration options that will get used by the Vue CLI when running the development server or building your application for production.
The first configuration option that I set is assetsDir
. This tells the Vue CLI where to put the js
, css
, img
, and fonts
files and folders. I set this to assets
since that is where I will put them in the Coldbox application.
module.exports = {
assetsDir: "assets"
}
Webpack Development Server
I will also set two settings for the webpack development server. They are devServer.port
and devServer.proxy
. The port setting tells which port to run the front-end development server on. I set this to 3001. The proxy setting is used to proxy requests from the front-end server to the back-end Coldbox application. Since I started my CommandBox server on port 3000. I set this setting to http://localhost:3000
. My full config file looks like this.
module.exports = {
assetsDir: "assets",
devServer: {
port: 3001,
proxy: 'http://localhost:3000'
}
}
CommandBox Scripts
I added a couple scripts to my box.json
file that can be run using the CommandBox run-script
command. The first is named dev
which just starts the front-end and back-end servers for development. The second is build
which runs a CommandBox task runner named build. This runs the client build process and copies the assets to the Coldbox asset directory. It also takes the index.html
file that is generated copies it to views/main/index.cfm
which is the Coldbox default view.
"scripts":{
"dev" : "start --force && !npm run serve --prefix ./client-app",
"build" : "task run ./build/scripts/build"
}
You can view the full task runner here on Github.
Routing
Vue.js Router
Here I changed the Vue.js router mode from hash mode to history mode. This takes the hash out of the URL and achieves a cleaner navigation.
client-app/src/router.js
export default new Router({
mode: 'history',
routes: [
...
]
})
Coldbox
I set up a default wildcard Coldbox route that points to the view views/main/index.cfm
. This allows any link other than API routes to load the client application.
config/Router.cfc
route(pattern=".*",handler="Main",action="index").end();
If you would like to see more of the code here is a github repository of the application I have started working on.