vue-cli version 3 brings a whole new developer experience. The Vue team put a great effort in making sure that creating a Vue.js project is smooth and that no initial configuration is required. At the same time, extending and tweaking the project configuration in a concise and easy way is also made possible.
Let’s take a look at some features of the new vue-cli.
v3 of the vue-cli is still in alpha at the time of this writing.
First you need to install it:
$ npm install -g @vue/cli
As you can see, Vue.js now uses scoped packages to distribute their packages under the @vue
namespace.
Then we can simply create a project by running:
$ vue create cli-test # cli-test is just any folder name
That will open up a prompt asking if you want the default config (eslint, babel) or if you’d like to add extra features, such as:
Depending on what options you choose, you’ll get more questions. Just choose what fits best for you. When you finish, dependencies will start to be installed and your project should be ready to go.
vue-cli should have created some configuration. The default configuration is created in the package.json and it looks like this:
{
// ...
"vue": {
"lintOnSave": true
},
"babel": {
"presets": [
"@vue/app"
]
},
"eslintConfig": {
"extends": [
"plugin:vue/essential",
"eslint:recommended"
]
},
"postcss": {
"plugins": {
"autoprefixer": {}
}
},
"browserslist": [
"> 1%",
"last 2 versions",
"not ie <= 8"
]
}
You can see a brand new @vue/app
package that has all the Babel configuration Vue needs to run. But you can still tweak it and add any other configuration you’d like.
As per the eslint config, it includes the plugin:vue/essential
which has a recommended ruleset for Vue following its style guide. Additionally it also includes eslint:recommended
but that can vary depending on your preferences. For example if you chose to have eslint and prettier, you’ll get @vue/prettier
instead.
You can tell the cli to put the config in separate files if you chose the features manually. That will create some files depending your choices such as .babelrc, .postcssrc, jest.config.js, tslint.json, etc. You can move out to files the config at any point by removing it from package.json and moving it to its respective config file.
When choosing the options manually, you’re asked whether you’d like to save that configuration as a preset for future project. That configuration is saved in ~/.vuerc, just in case you need to modify it at some point.
Out of the box, you’ll get a zero-config development and production environment that is already setup following best practices. The dev environment comes with hot module reloading, fast building, and more while the production one provides minification, module concatenation, code optimizations and so.
This happens thanks to vue-cli-service
, used in the npm scripts of your package.json files. Internally, vue-cli-service has webpack configurations ready for different environments.
The scripts available to us by default are:
And if you added more features, you could get some extra scripts:
You can run any of those by using npm run
. For instance: npm run serve
will start a dev server.
vue-cli uses the conventional .env file as suggested by the twelve factor app. That makes sure it follows standard conventions and is cross-compatible with other systems.
You can define a .env file as follows:
VUE_APP_BASE_URI=/api
VUE_APP_DEBUG=true
Only variables starting with `VUE_APP_` are loaded. Make sure you name them correctly.
And they’ll be be loaded and available using process.env.VUE_APP_BASE_URI
, for example.
You can also define environment variables per environment. For that you must add the appropriate suffix, which are taken from the NODE_ENV variable:
.env.development
.env.production
.env.test
They will override the base .env values. For example, from the previous example, it’s better that we define VUE_APP_DEBUG
based on the environment:
VUE_APP_DEBUG=true
VUE_APP_DEBUG=false
You can configure a proxy by adding a proxy
object to the package.json file in order to forward some calls to a specific url in development:
{
"proxy": {
"/api": "http://localhost:4000"
}
}
That way, all calls that match the /\/api/
pattern will be forwarded to http://localhost:4000
By default, you’ll have a vue
config key on your package.json, but you can move out that config to a vue.config.js file.
The vue.config.js file is intended to have app configuration. For now, there are already a few properties you can use, but it’s expected that this file will be the target for upcoming features or plugins:
module.exports = {
lintOnSave: true,
configureWebpack: {
output: {
path: __dirname + "/cool-build"
}
}
};
I think lintOnSave
is pretty descriptive on its own already.
The configureWebpack
key allows us to modify the internal default webpack configuration. That’s really powerful, since by default you have the most common features setup for different environments with no config at all. But if you need it, you can tweak it using this key. In the example, I’m just changing the output path which defaults to /dist
.
The configureWebpack
object will be merged with the internal one. You can also use a function that accepts the config as an argument:
module.exports = {
configureWebpack: config => {
// ...
}
};
You can always start from the basic default configuration and add functionality as you go by using plugins. They all work in the same way: you install them, then invoke them and they do the magic for you.
For example, say you need to have Progressive Web App (PWA) functionality and you didn’t choose it when you created the project. To add it is as easy as:
$ npm install @vue/cli-plugin-pwa
$ vue invoke pwa # you don't need the @vue/cli-plugin- prefix
Plugins can also have options when they are invoked. For example, cli-plugin-eslint
can be invoked with the following arguments:
$ vue invoke eslint --config airbnb --lintOn save
You’ve seen an overview of the new vue-cli. It has a well defined architecture that makes it extensible while starting off from zero config. It covers some usual cases like proxying or setting environment variables as well. Expect more cool features and plugins in the future.
Stay cool 🦄
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
While we believe that this content benefits our community, we have not yet thoroughly reviewed it. If you have any suggestions for improvements, please let us know by clicking the “report an issue“ button at the bottom of the tutorial.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!