zoukankan      html  css  js  c++  java
  • 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
    选择 vue2 或者 vue3
    image

    搭建后的目录结构
    image

    可以增加 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 优化项 -- 压缩和剔除log代码
    		// 一般 terser-webpack-plugin替代uglifyjs-webpack-plugin,此处与上面的terserOptions同样意义
    		config.optimization = {
    			minimizer: [
    				// new UglifyJSPlugin({})
    			]
    		},
            // 将变量注入每个模块 -- 即将公共方法和变量通过此处注入每个模块(使用eslint后会有异味,不建议使用)
            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: {
    		// 配置全局less变量 -- 需要安装style-resources-loader 和 vue-cli-plugin-style-resources-loader
            '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

  • 相关阅读:
    redis问题排查
    javassist介绍
    Idea创建父子工程
    sentry的配置
    Redis的基本操作以及info命令
    es~日期类型需要注意的
    jboss~静态文件路由和自定义日志
    java~RMI引起的log4j漏洞
    链路跟踪~对接阿里ARMS
    navicat~导出数据库密码
  • 原文地址:https://www.cnblogs.com/nangezi/p/14706550.html
Copyright © 2011-2022 走看看