作为一名长期使用Vue进行开发的前端工程师,我发现很多新手在启动Vue项目时都会遇到一个典型问题:明明按照教程输入了npm run dev,却总是收到"missing script: dev"的错误提示。这其实是因为Vue CLI和Vite两种不同构建工具在命令设计上的差异导致的。
Vue CLI(Vue Command Line Interface)是Vue官方提供的标准脚手架工具,它在创建项目时默认生成的启动命令是npm run serve。这个设计背后有几个技术考量:
serve更准确地描述了该命令的功能 - 启动一个本地开发服务器(development server),而dev(development的缩写)含义相对宽泛serve是更常见的启动命令dev脚本用于其他用途提示:如果你使用的是Vue 3 + Vite的新项目,确实会看到
npm run dev,这是Vite的默认约定。两种方式没有优劣之分,只是不同工具链的约定不同。
当你遇到"missing script"错误时,最专业的做法不是立即去修改package.json,而是先查看项目实际支持哪些命令:
bash复制npm run
这个命令会列出当前项目package.json中定义的所有可执行脚本。典型Vue CLI项目的输出如下:
code复制Scripts available in my-vue-project via `npm run-script`:
serve
vue-cli-service serve
build
vue-cli-service build
lint
vue-cli-service lint
这个清单清晰地展示了:
serve:启动开发服务器build:构建生产环境代码lint:运行代码检查当你运行npm run serve时,实际上发生了以下技术流程:
这个过程中有几个关键点值得注意:
vue-cli-service是Vue CLI的核心可执行文件根据项目创建方式和Vue版本的不同,启动命令确实存在差异:
| 项目类型 | 创建命令 | 启动命令 | 构建工具 |
|---|---|---|---|
| Vue CLI (Vue 2) | vue create my-project | npm run serve | webpack |
| Vue CLI (Vue 3) | vue create my-project | npm run serve | webpack |
| Vite (Vue 3) | npm create vite@latest | npm run dev | Vite |
这个表格解释了为什么有些教程使用dev而有些使用serve - 它们针对的是不同的项目初始化方式。
虽然我建议新手先适应标准的serve命令,但如果你确实习惯使用dev,可以按照以下方式修改package.json:
json复制{
"scripts": {
"serve": "vue-cli-service serve",
"dev": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint"
}
}
修改时需要注意:
npm install确保依赖是最新的对于企业级项目,我推荐采用更完善的脚本配置:
json复制{
"scripts": {
"serve": "vue-cli-service serve",
"dev": "npm run serve",
"build": "vue-cli-service build",
"build:prod": "vue-cli-service build --mode production",
"build:test": "vue-cli-service build --mode test",
"lint": "vue-cli-service lint",
"test": "vue-cli-service test:unit",
"prepare": "husky install"
}
}
这种配置的优点:
serve作为标准命令dev作为别名指向serve如果npm run serve也报错,可能是以下原因:
依赖未安装:
bash复制npm install
Vue CLI未全局安装:
bash复制npm install -g @vue/cli
端口冲突:
bash复制npm run serve -- --port 8081
缓存问题:
bash复制npm cache clean --force
rm -rf node_modules
npm install
添加--verbose参数可以获取更多调试信息:
bash复制npm run serve -- --verbose
这会输出:
对于复杂的多页面应用,你可能需要在vue.config.js中添加特殊配置:
javascript复制module.exports = {
pages: {
index: {
entry: 'src/main.js',
template: 'public/index.html',
filename: 'index.html',
},
admin: {
entry: 'src/admin/main.js',
template: 'public/admin.html',
filename: 'admin.html',
}
}
}
这种配置下,启动命令仍然是npm run serve,但会同时处理多个入口文件。
大型Vue项目启动缓慢时,可以尝试以下优化:
调整webpack的loader配置:
javascript复制// vue.config.js
module.exports = {
configureWebpack: {
module: {
rules: [
{
test: /\.js$/,
loader: 'babel-loader',
include: [path.resolve('src')]
}
]
}
}
}
使用DLLPlugin预编译依赖:
javascript复制// 创建webpack.dll.conf.js
module.exports = {
entry: {
vendor: ['vue', 'vue-router', 'vuex']
},
output: {
filename: '[name].dll.js',
path: path.resolve(__dirname, './dll'),
library: '[name]'
}
}
开启缓存:
javascript复制module.exports = {
configureWebpack: {
cache: {
type: 'filesystem'
}
}
}
在vue.config.js中,你可以深度定制开发服务器:
javascript复制module.exports = {
devServer: {
host: 'local.example.com',
port: 8080,
https: true,
proxy: {
'/api': {
target: 'http://backend:3000',
changeOrigin: true
}
},
onBeforeSetupMiddleware: (devServer) => {
devServer.app.get('/setup', (req, res) => {
res.json({ custom: 'response' })
})
}
}
}
这些配置可以让你:
随着Vite的普及,新创建的Vue 3项目大多使用npm run dev作为启动命令。这是因为:
如果你接手一个老项目,可以通过以下特征判断:
Vue CLI项目特征:
Vite项目特征:
如果你考虑从Vue CLI迁移到Vite,可以:
我在实际迁移过程中发现,Vite对大多数Vue 3项目兼容性良好,但一些特殊配置(如自定义loader)需要额外处理。