@vue/cli and create-react-app are command-line tools designed to set up boilerplate code for Vue and React projects. They handle configuration for bundlers, linters, and test runners so developers can start coding immediately. Both tools rely on Webpack under the hood and provide a zero-config experience for standard use cases. However, both tools are currently in maintenance mode, with official documentation suggesting modern alternatives for new projects.
Both @vue/cli and create-react-app served as the standard entry points for building Vue and React applications for many years. They abstract away complex Webpack configurations, allowing developers to focus on writing components rather than managing build scripts. However, the landscape has shifted. Both tools are now in maintenance mode, meaning they receive security fixes but no new features. Let's compare how they work and why modern teams are moving away from them.
@vue/cli is in maintenance mode.
create-vue for new Vue 3 projects.# vue: Check version (Vue 2 focused)
vue --version
# Creates a Vue 2 or 3 project based on plugins
vue create my-project
create-react-app is in maintenance mode.
# react: Check version
npx create-react-app --version
# Creates a React project
npx create-react-app my-app
@vue/cli allows configuration without breaking the setup.
vue.config.js file to customize Webpack.// vue: vue.config.js
module.exports = {
configureWebpack: {
resolve: {
alias: {
'@': '@/src'
}
}
}
};
create-react-app hides configuration by default.
craco to avoid ejecting.// react: craco.config.js (requires extra package)
module.exports = {
webpack: {
alias: {
'@': './src'
}
}
};
@vue/cli uses Webpack Dev Server.
# vue: Start dev server
npm run serve
# Access at http://localhost:8080
create-react-app uses Webpack Dev Server.
// react: Start dev server
npm start
// Access at http://localhost:3000
@vue/cli includes Jest or Mocha based on selection.
// vue: tests/unit/example.spec.js
import { shallowMount } from '@vue/test-utils'
import HelloWorld from '@/components/HelloWorld.vue'
describe('HelloWorld.vue', () => {
it('renders props.msg when passed', () => {
// Test logic here
})
})
create-react-app includes Jest and React Testing Library.
// react: src/App.test.js
import { render, screen } from '@testing-library/react';
import App from './App';
test('renders learn react link', () => {
render(<App />);
// Test logic here
});
@vue/cli provides detailed build reports.
webpack-bundle-analyzer via plugin if needed.# vue: Build for production
npm run build
# Outputs to dist/ folder
create-react-app provides standard build output.
// react: Build for production
npm run build
// Outputs to build/ folder
While they target different frameworks, both tools share a common philosophy and architecture. Here are key overlaps:
# Both: Check dependencies
npm list webpack
# Will show webpack in both project trees
// Vue: Plugin usage in vue.config.js
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({ pluginOptions: { /*...*/ } })
// React: Wrapper usage in craco.config.js
module.exports = { plugins: [ /*...*/ ] }
# Vue: .env file
VUE_APP_API_URL=https://api.example.com
# React: .env file
REACT_APP_API_URL=https://api.example.com
tsconfig.json automatically.// Both: tsconfig.json snippet
{
"compilerOptions": {
"target": "es5",
"module": "esnext"
}
}
// Both: package.json scripts
{
"scripts": {
"lint": "vue-cli-service lint"
}
}
| Feature | Shared by Vue CLI and CRA |
|---|---|
| Bundler | π¦ Webpack |
| Testing | π§ͺ Jest |
| Language | β TypeScript Support |
| Quality | π‘οΈ ESLint |
| Env Vars | π .env files |
| Status | β οΈ Maintenance Mode |
| Feature | @vue/cli | create-react-app |
|---|---|---|
| Config | π οΈ vue.config.js allowed | π Hidden (eject or craco) |
| Test Runner | π§ͺ Jest or Mocha (choice) | π§ͺ Jest (fixed) |
| Framework | π’ Vue 2 / Vue 3 | βοΈ React |
| Env Prefix | π VUE_APP_ | π REACT_APP_ |
| Output Folder | π dist/ | π build/ |
| Official Status | β οΈ Maintenance (Vue 2 EOL) | β οΈ Not Recommended for New |
@vue/cli is like a customizable workshop π¨βit lets you tweak the tools without breaking the setup. Ideal for teams stuck on Vue 2 or needing specific Webpack loaders without migrating to Vite.
create-react-app is like a sealed appliance π¦βit works perfectly until you need to open the hood. Ideal for beginners or teams maintaining older React codebases who want stability over flexibility.
Final Thought: Both tools solved major problems in their time by simplifying setup. However, for new projects, the industry has moved toward Vite-based solutions (create-vue, vite) or full-stack frameworks (Next.js, Nuxt). Use these legacy tools only when maintaining existing systems β not when building the future.
Choose create-react-app only if you are maintaining a legacy React project or teaching React fundamentals without discussing build tools. It provides a stable, unchanging environment that works well for learning basics. Do not use this for new production React applications, as the React team officially recommends frameworks like Next.js or tools like Vite instead.
Choose @vue/cli only if you are maintaining an existing Vue 2 codebase or require specific Webpack configurations not yet supported by Vite. It offers a interactive setup wizard and plugin system that simplifies adding features like TypeScript or PWA support. Do not use this for new Vue 3 projects, as the official recommendation is now create-vue.
This package includes the global command for Create React App.
Please refer to its documentation: