vue项目的简单搭建,vue init 和 vue create 的区别


本文基于:
vue-cli@4.5.13
vue@2.6.11

vue create 和 init 的区别

是vue-cli3.x的初始化方式,目前模板是固定的,模板选项可自由配置,创建出来的是vue-cli3的项目,与cue-cli2项目结构不同,配置方法不同,具体配置方法参考官方文档。

vue create demo 使用 create 命令搭建

vue init 是vue-cli2.x的初始化方式,可以使用github上面的一些模板来初始化项目,webpack是官方推荐的标准模板名。vue-cli2.x项目向3.x迁移只需要把static目录复制到public目录下,老项目的src目录覆盖3.x的src目录(如果修改了配置,可以查看文档,用cli3的方法进行配置)

vue init webpack demo 使用init 命令搭建,使用webpack
vue init simulatedgreg/electron-vue demo 创建electron项目


使用 vue create demo 搭建项目

前提: npm install -g @vue/cli 安装vue-cli

image.png

选择 vue2 或者 vue3


image.png

搭建后的目录结构


image.png

可以增加 babel.config.js

可以增加 .browserslistrc 同 package.json中的 browserslist属性

可以增加 eslintrc.js eslintignore 同 package.json中的 eslintConfig属性

可以增加 .env.development .env.production 可以通过 process.env.xxx 获取当前模式的变量,以此区分当前的模式

可以增加 vue.config.js来配置运行时或打包时的信息(类似于webpack.config.js)

vue.config.js 是一个可选的配置文件,如果项目的 (和 package.json 同级的) 根目录中存在这个文件,那么它会被 @vue/cli-service 自动加载。你也可以使用 package.json 中的 vue 字段,但是注意这种写法需要你严格遵照 JSON 的格式来写。

实际上 vue-cli 就是集成了webpack作为打包工具

基于 webpack 构建,并带有合理的默认配置;


vue.config.js


const path = require('path');
const webpack = require('webpack');

// 注意 process.env.VUE_APP_CURRENTMODE 都是源于 package.json 中的 scripts模块  和 对应的 .env.xxx 文件
// vue-cli-service build --mode production 对应 .env.production文件(其中定义了变量VUE_APP_CURRENTMODE),所以process.env.VUE_APP_CURRENTMODE === 'production'
// vue-cli-service serve 对应 .env.development文件(其中定义了变量VUE_APP_CURRENTMODE),所以process.env.VUE_APP_CURRENTMODE === 'development'

// 开发环境
const IS_DEV = process.env.VUE_APP_CURRENTMODE === 'development'
// 正式环境
const IS_RELEASE = process.env.VUE_APP_CURRENTMODE === 'production'


function resolve(dir) {
    return path.join(__dirname, dir);
}

module.exports = {
    publicPath: '/',    // 默认 /
    outputDir: 'dist',  // 默认dist,打包输出内容的存放目录
    // assetDir: '',       // 默认空字符串,放置生成的静态资源 (js、css、img、fonts) 的 (相对于 outputDir 的) 目录。
    // indexPath: 'index.html',    // 默认 index.html,指定生成的 index.html 的输出路径 (相对于 outputDir)。也可以是一个绝对路径
    // filenameHashing: true,  // 默认值true,是否在打包时,文件名使用hash(以便更好的控制缓存),false可以关闭
    // 正式环境关掉 sourceMap
    css: {
        sourceMap: !IS_RELEASE,    // 默认值false,是否为 CSS 开启 source map
    },
    productionSourceMap: !IS_RELEASE, // 默认值true,如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。
    lintOnSave: IS_DEV,   // 是否在开发环境下通过 eslint-loader 在每次保存时 lint 代码。这个值会在 @vue/cli-plugin-eslint 被安装之后生效。

    // 链式 webpack 配置
    chainWebpack: config => {
        // 小文件转换为 base64
        config.module
            .rule('images')
            .use('url-loader')
            .loader('url-loader')
            .tap(options => 
                Object.assign(options, {
                    limit: 10240,
                    fallback: {
                        loader: 'file-loader',
                        options: {
                            name: 'images/[name].[ext]'
                        }
                    }
                })
            );
        // 生产环境删除console
        config.when(IS_RELEASE, config => {
            config.optimization.minimizer('terser').tap(options => {
                options[0].terserOptions.compress.drop_console = true
                return options
            })
        })
        // 配置不同的cdn域名
        config.plugin('html')
            .tap(args => {
                args[0].cdn = "..." // 
                return args
            })
    },

    // webpack 配置
    configureWebpack: config => {
        Object.assign(config.resolve, {
            alias: {
                '@': resolve('src'),
                '_c': resolve('src/components'),
                '_v': resolve('src/views'),
                '_a': resolve('./src/assets'),    // 定义项目中使用的简化相对路径
            },
            extensions: ['.js', '.vue', '.less', '.json'],
            modules: [resolve('node_modules'), 'node_modules'],
            mainFields: ['browser', 'module', 'main']
        });
        // webpack 优化项
        // 将变量注入每个模块 -- ???
        config.plugins.push(
            new webpack.ProvidePlugin({
                // 全局配置项
                _Global: [resolve('./src/config/index.js'), 'default'], 
                // 工具库
                _t: [resolve('./src/utils/tools.js'), 'default'],
                // 二次封装埋点库
                _s: [resolve('./src/utils/stat.js'), 'default']
            })
        )
    },

    devServer: {
        open: true,
        host: 'localhost',
        port: 8686, // 默认 8080
        // 接口代理配置
        // proxy: {

        // }
    },
    // ???
    pluginOptions: {
        'style-resources-loader': {
            preProcessor: 'less',
            pattern: [
                resolve('src/assets/images/styles/var.less'),
                resolve('src/assets/images/styles/mixin.less')
            ]
        }
    }
}

package.json

{
  "name": "demo",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint"
  },
  "dependencies": {
    "core-js": "^3.6.5",
    "vue": "^2.6.11"
  },
  "devDependencies": {
    "@vue/cli-plugin-babel": "~4.5.0",
    "@vue/cli-plugin-eslint": "~4.5.0",
    "@vue/cli-service": "~4.5.0",
    "babel-eslint": "^10.1.0",
    "eslint": "^6.7.2",
    "eslint-plugin-vue": "^6.2.2",
    "vue-template-compiler": "^2.6.11"
  }
}

src/main.js

import App from './App';
import store from ..
import router from ..
// 全局注入自定义指令
import directives from '@directive/index';
import lodash from 'lodash'
import moment from 'moment'

import '@/icons'
import '@/permission'
// 全局过滤器
import * as filters from './filters'
// 将lodash挂载全局变量
window._ = lodash
// 将moment挂载全局变量
window.moment = moment

Vue.use(ElementUI, {locale})

Vue.use(directives)

Vue.config.productionTip = false

Object.keys(filters).forEach(key => {
  Vue.filter(key, filters[key])
})

new Vue({
  el: '#app',
  router, 
  store,
  render: h => h(App)
})

vue-cli官网:
https://cli.vuejs.org/zh/guide/
vue init 和 vue create 的区别:
https://blog.csdn.net/aerchi/article/details/105062622

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,919评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,567评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,316评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,294评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,318评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,245评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,120评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,964评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,376评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,592评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,764评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,460评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,070评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,697评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,846评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,819评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,665评论 2 354

推荐阅读更多精彩内容