vue-cli3项目结构及配置

1.项目结构

项目结构图

精简了很多,但还是和vue2.0有很多区别的,基本的用法变化不是特别大

① vuex(状态管理):

  vue cli 2 中 :vuex是搭建完成后自己npm install的,并不包括在搭建过程中。可以看到vue cli 2的vuex默认文件夹(store)又包含了三个js文件:action(存放一些调用外部API接口的异步执行的的方法,然后commit mutations改变mutations 数据)、index(初始化mutations 数据,是store的出口)、mutations(处理数据逻辑的同步执行的方法的集合,Vuex中store数据改变的唯一方法commit mutations)

  vue cli 3 中:vuex是包含在搭建过程供选择的预设。vue cli 3 中默认只用一个store.js代替了原来的store文件夹中的三个js文件。action、mutations、state以及store 的 getters 的用法有很多

② router (路由):

  vue cli 2 :“ router/index.js ”

  vue cli 3:“router.js”(用法和做的事都一样)

③ 去掉 static  、 新增 public 文件夹

  vue cli 2 :static 是 webpack 默认存放静态资源的文件夹,打包时会直接复制一份到dist文件夹不会经过 webpack 编译

  vue cli 3 :摒弃 static 新增了 public 。vue cli 3 中“静态资源”两种处理方式:

  经webpack 处理:在 JavaScript 被导入或在 template/CSS 中通过“相对路径”被引用的资源会被编译并压缩

       不经webpack 处理:放置在public目录下或通过绝对路径被引用的资源将会“直接被拷贝”一份,不做任何编译压缩处理

④ index.html :

        vue cli 2:“index.html ”

        vue cli 3:“public/index.html ”此模板会被html-webpack-plugin 处理的

⑤ src/views:

        vue cli 3的 src文件夹 新增 views文件夹 用来存放 “页面”,区分 components(组件)

⑥ 去掉 build(根据config中的配置来定义规则)、config(配置不同环境的参数)文件夹 :

        vue cli 3中,这些配置 你可以通过 命令行参数、或vue.config.js(在根目录 新建一个 vue.config.js 同名文件)里的devServer 字段配置开发服务器

⑦ babel.config.js:

        配置Babel 。Vue CLI 使用了 Babel 7 中的新配置格式babel.config.js。和.babelrc或package.json中的babel字段不同,这个配置文件不会使用基于文件位置的方案,而是会一致地运用到项目根目录以下的所有文件,包括node_modules内部的依赖。官方推荐在 Vue CLI 项目中始终使用babel.config.js取代其它格式。

⑧ 根目录的一些其他文件的改变:

        之前所有的配置文件都在vue create 搭建时preset预设 或者 后期可以通过 命令参数 、vue.config.js 中配置

        根据需要在根目录下新建 vue.config.js自行配置,eg:(简单配置,更多配置详情参见官网:https://cli.vuejs.org/zh/config/

module.exports = {

  baseUrl: '/',// 部署应用时的根路径(默认'/'),也可用相对路径(存在使用限制)

  outputDir: 'dist',// 运行时生成的生产环境构建文件的目录(默认''dist'',构建之前会被清除)

  assetsDir: '',//放置生成的静态资源(s、css、img、fonts)的(相对于 outputDir 的)目录(默认'')

  indexPath: 'index.html',//指定生成的 index.html 的输出路径(相对于 outputDir)也可以是一个绝对路径。

  pages: {//pages 里配置的路径和文件名在你的文档目录必须存在 否则启动服务会报错

    index: {//除了 entry 之外都是可选的

      entry: 'src/index/main.js',// page 的入口,每个“page”应该有一个对应的 JavaScript 入口文件

      template: 'public/index.html',// 模板来源

      filename: 'index.html',// 在 dist/index.html 的输出

      title: 'Index Page',// 当使用 title 选项时,在 template 中使用:<title><%= htmlWebpackPlugin.options.title %></title>

      chunks: ['chunk-vendors', 'chunk-common', 'index'] // 在这个页面中包含的块,默认情况下会包含,提取出来的通用 chunk 和 vendor chunk

    },

    subpage: 'src/subpage/main.js'//官方解释:当使用只有入口的字符串格式时,模板会被推导为'public/subpage.html',若找不到就回退到'public/index.html',输出文件名会被推导为'subpage.html'

  },

  lintOnSave: true,// 是否在保存的时候检查

  productionSourceMap: true,// 生产环境是否生成 sourceMap 文件

  css: {

    extract: true,// 是否使用css分离插件 ExtractTextPlugin

    sourceMap: false,// 开启 CSS source maps

    loaderOptions: {},// css预设器配置项

    modules: false// 启用 CSS modules for all css / pre-processor files.

  },

  devServer: {// 环境配置

    host: 'localhost',

    port: 8080,

    https: false,

    hotOnly: false,

    open: true, //配置自动启动浏览器

    proxy: {// 配置多个代理(配置一个 proxy: 'http://localhost:4000' )

      '/api': {

        target: '<url>',

        ws: true,

        changeOrigin: true

      },

      '/foo': {

        target: '<other_url>'

      }

    }

  },

  pluginOptions: {// 第三方插件配置

    // ...

  }

};

vue-cli升级到3之后,减少了很多的配置文件,将所有的配置项都浓缩到了vue.config.js这个文件中,所以学懂并会用vue.config.js文件很重要。

这里有一篇关于vue-cli3的全面配置的文章供大家参考,https://segmentfault.com/a/119000001700869

2.热更新配置

在vue.config.js添加

chainWebpack: config => {

// 修复HMR

config.resolve.symlinks(true);

}

运行发现css没有执行热更新,然后再在vue.config.js添加并修改

css: {

        // 是否使用css分离插件 

        //extract: true,

        // 开启 CSS source 

        ExtractTextPluginsourceMap:false,

        // css预设器配置项

        mapsloaderOptions: {},

        // 启用 CSS modules for all css / pre-processor files

        modules:false,

 }

下面是我自己的vue.config.js配置

//引入gzip

const CompressionPlugin =require('compression-webpack-plugin');

//引入cdn

const cdn = {

     js: [

         'https://lib.baomitu.com/vue/2.6.10/vue.min.js',

         'https://lib.baomitu.com/vuex/3.1.0/vuex.min.js',

         'https://lib.baomitu.com/vue-router/3.0.6/vue-router.min.js',

         'https://cdn.jsdelivr.net/npm/vue',

        'https://cdn.jsdelivr.net/npm/ant-design-vue@1.6.5/dist/antd.min.js',

        'https://lib.baomitu.com/moment.js/2.29.1/moment.min.js',

         'https://lib.baomitu.com/moment.js/2.20.1/locale/zh-cn.js'

    ],

    css: ['https://cdn.jsdelivr.net/npm/ant-design-vue@1.6.5/dist/antd.min.css']

}

module.exports = {

    devServer: {

        proxy: {

            "/api": {

                    // 木木

                    // target: 'http://192.168.3.108:8090/',

                    // target: "http://42.192.157.203:80/",

                    // target: "http://mumu.cn1.utools.club",

                    // target: 'http://127.0.0.1:8090/',

                    ws:true,

                    changeOrigin:true,

                    autoOpenBrowser:true,

            }

        },//新版的webpack-dev-server出于安全考虑,默认检查hostname,如果hostname不是配置内的,将中断访问。解决方法:

       disableHostCheck: true 

  },

  // 查看打包文件体积大小

   chainWebpack: config => {

       config

          .plugin('webpack-bundle-analyzer')

          .use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin)

         .end();

     config.plugins.delete('prefetch')

 },

  // cdn处理

  chainWebpack(config) {

       config.plugin('html').tap(opts => {

            opts[0].cdn = cdn;

             return opts

      })

  },

  //css分离

   css:{

         //  是否使用css分离插件ExtractTextPlugin

         extract:false,

         //  开启CSS source maps?

         sourceMap:false,

        // css预设器配置项

        loaderOptions:{},

        //   启用CSS modules for all css / pre-processor files.

        requireModuleExtension:false,

 },

  // 再次打包就没有.map文件了

  productionSourceMap:false,

 // 在 vue.congig.js中引入gzip并修改 webpack配置

  configureWebpack: {

        // 用cdn方式引入

            externals:{

                 'vue': 'Vue',

                 'vuex': 'Vuex',

                 'vue-router': 'VueRouter',

                'ant-design-vue': 'antd',

                "moment": "moment",

           },

        plugins: [

            new CompressionPlugin({

                    test:/\.js$|\.html$|\.css/,// 哪些文件要压缩

                    // filename: '[path].gz[query]', // 压缩后的文件名

                    threshold:0,//对只有大小大于该值的资源会被进行压缩

                    algorithm:'gzip', // 使用gzip压缩

                    minRatio:0.8, // 压缩率小于0.8才会压缩

                    deleteOriginalAssets:false // 删除未压缩的文件,谨慎设置,如果希望提供非gzip的资源,可不设置或者设置为false

              })

      ],

     //分割代码

    optimization : {

            splitChunks: {

                // chunks: 'all',

                cacheGroups: {

                    vendor: {

                        chunks:'all',

                        test:/node_modules/,

                        name:'vendor',

                        minChunks:1,

                        maxInitialRequests:5,

                        minSize:0,

                        priority:100

                 },

                common: {

                        chunks:'all',

                        test:/[\\/]src[\\/]js[\\/]/,

                        name:'common',

                        minChunks:2,

                        maxInitialRequests:5,

                        minSize:0,

                        priority:60

              },

                styles: {

                        name:'styles',

                        test:/\.(sa|sc|c)ss$/,

                        chunks:'all',

                        enforce:true

              },

            runtimeChunk: {

                    name:'manifest'

              }

        }

    }

},

//上诉为公共代码抽离

  },

};

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

推荐阅读更多精彩内容