vue-cli项目相关配置

前言

vue脚手架(vue-cli) 是快速构建vue项目的系统框架

vue-cli安装

全局安装 npm install @vue/cli -g
检测是否安装成功 vue --version / vue -V 检测的是脚手架
目前vue-cli版本为 4.5.9
若想要使用脚手架2创建项目 需要全局安装一个桥接工具 @vue/cli-init
npm install @vue/cli-init -g
安装完成后就可以使用脚手架2创建项目了
创建项目的方式:
    脚手架2 -->  vue init webpack 项目名称
    脚手架3以上 -->  vue create 项目名称

webpack配置相关

extractTextPlugin 插件

webpack打包项目时,会将资源文件转换成javascript代码来与其他模块合并,
遇到css文件时候也会将css代码打包到js文件中,这样在访问时候会有一定的延迟。
如果需要将css文件单独打包出来,需要使用extract-text-webpack-plugin插件,
这样打包后css代码会在单独的css/xxx.css文件中

== vue-cli2中在webpack.prod.conf.js中是配置好的

chunkName

webpack会把所有资源打包成一个一个文件再引入,默认打包后的文件是以id + hash命名的,
如果需要更改名字,需要配置一个chunkFilename属性
vue-cli2:
   1、在config/webpack.prod.conf.js中 output对象中更改chunkFileName属性
    原来为: chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
    改为: chunkFilename: utils.assetsPath('js/[name].[chunkhash].chunk.js')
   2、引入组件的时候 使用一种特殊的注释法为文件命名
         /* webpackChunkName: "" */ (魔术注释法)
   同步加载:
     const Home = import(/* webpackChunkName:'Home' */ 'views/home/Home.vue');
    异步加载:
     component:()=>import(/* webpackChunkName:'Home' */'views/home/Home.vue') 
可以多个组件使用同一个名字 这样就会打包进同一个chunk文件中 
此时打包后 会发现一个个js文件都有名字了  

vendor文件过大问题

vendor.xx.js >= 700kb 过大
解决办法:
    将不经常改变的文件分离出去不打包进vendor 等到项目运行时候再去外部获取这些依赖
|、 externals方式,不将三方包打包进去
1、直接配置externals
vue-cli2:  
          1、在html文件中引入不打包的库的cdn地址
            <script src="https://lib.baomitu.com/vue/2.6.12/vue.min.js"></script>
            <script src="https://cdn.jsdelivr.net/npm/vant@2.0/lib/vant.min.js"></script>
          2、在 config/webpack.conf.js中添加externals选项 
             // key 为项目中引入的名字 value为库导出的对象值
            externals: {
            'vue': 'Vue',
            'ant':'vant'
          }
          3、在mian.js中引入需要的库 即是配置中的key的值
            // vant
            import Vant from 'ant';
            import 'vant/lib/index.css'
            Vue.use(Vant);
vue-cli3:
        1、html文件中script标签引入需要分离出来的库的cdn地址
        <script src="https://cdn.bootcss.com/vue/2.5.16/vue.min.js"></script>
        2、vue.config.js:
             configureWebpack: {
                  externals: {    //key:为项目中使用vue处用的名字
                    'vue': 'Vue'  //value:库导出的对象
                  }
               }
          3、npm run build 发现vendor变小
2、使用 html-webpack-externals-plugin 插件
vue-cli2:
        1、安装 npm install html-webpack-externals-plugin--save-dev
        2、build/webpack.base.conf.js:
            plugins: [
                new HtmlWebpackExternalsPlugin({
                  externals: [
                    {
                      module: 'vv',
                      entry: 'https://cdn.jsdelivr.net/npm/vant@2.0/lib/vant.min.js',
                      global: 'vant'
                    }
                  ]
                })
              ]
         3、打包后发现html中自动引入了当前库的cdn地址
          <script type=text/javascript src=https://cdn.jsdelivr.net/npm/vant..></script>
||、使用路由懒加载
require方式:
import方式:
    component:()=>import(/*webpackChunName:'Home'*/ 'src/views/....')

px2rem-loader + lib-flexible

    vue脚手架中将px转rem 需要两个文件 lib/flexible、px2rem-loader
        lib/flexible 作用是根据屏幕变化自动添加标签 改变html的字体大小
        px2rem-loader 作用是将px转化为rem
    下载 npm install lib/flexible px2rem-loader --save-dev

vue-cli2:
    1、引入lib/flexible
        main.js:
        import 'lib/flexible';
       lib/flexible 会自动在html文件中添加 viewport标签 所以不需要自己添加
    2、配置px2rem-loader
    build/util.js:
       a、在cssLoaders中添加px2rem-loader对象:
            exports.cssLoaders = function(options) {
              options = options || {};
              const px2remLoader = {
                loader: "px2rem-loader",
                options: {
                  remUnit: 120
                }
              };
              const cssLoader = {
              .....
        b、在 generateLoaders 函数中 为 loaders 数组添加px2remLoader
             function generateLoaders(loader, loaderOptions) {
                const loaders = options.usePostCSS
                  ? [cssLoader, postcssLoader, px2remLoader]
                  : [cssLoader, px2remLoader];
                if (loader) {
                    ....
    此时重新执行 npm run dev 即可看到改变

vue-cli3:
    在项目根目录新建文件vue.config.js。。。。
目前建议使用postcss-px2rem

大于540px屏幕:
由于flexible主要用于手机自适应,所以屏幕宽度大于540px时,他就将font-size固定为54px
大于540px的屏幕就不会根据屏幕变化改变html的font-size了
适配大屏可以通过修改flexible源码解决:
        在node_modules/lib-flexible中修改flexible.js 
         function refreshRem(){
                var width = docEl.getBoundingClientRect().width;
                if (width / dpr > 540) {
                    width = width * dpr;  // 屏幕大于540px时候 根据宽度改变font-size
                }
                var rem = width / 10;
                docEl.style.fontSize = rem + 'px';
                flexible.rem = win.rem = rem;
            }

不想px转rem的地方:
    有的地方想保持原尺寸 不想px转为rem 比如1像素的边框等
    可以为其添加 /* no */
     .circle{
        border:1px solid #ccc; /* no */
     }

px2rem-loader + amfe-flexible

lib-flexible 不再更新了 改为amfe-flexible
使用方法大多同上面的lib-flexible 
区别1:
    html文件中不可删除 viewport标签 不会自动生成   

postcss

是什么
postcss 是一个插件系统,也是一个平台,是一个使用插件去转换css的工具,
他有200多个插件 可以实现不同的css转换需求 比如 Autoprefixer,
autoprefixer是一个自动添加浏览器前缀的插件,根据can i use的数据 对不同浏览器添加不同的前缀。
postcss是一个平台、提供了一些api,通过调用这些api也可以自己开发插件
autoprefixer
vue-cli2 中autoprefixer的配置:
       1、在 .postcssrc.js 文件中可以看到有autoprefixer
       2、浏览器数据配置在package.json中最后有 browserslist
vue-cli3 中autoprefixer的配置:
        vue-cli3中默认是开启autoprefixer的 。。
postcss-pxtorem
安装 npm install postcss-pxtorem
配置:
vue-cli2:
    .postcss.js:
             module.exports = {
              "plugins": {
                "postcss-import": {},
                "postcss-url": {},
                "autoprefixer": {},
                "postcss-pxtorem": { // 在此处配置postcss-pxtorem
                  rootValue: 32, // 对应16px 适配移动端750px宽度
                  unitPrecision: 5,
                  propList: ['*'],
                  selectorBlackList: [],
                  replace: true,
                  mediaQuery: false,
                  minPixelValue: 0
                  }
                }
              }
vue-cli3:
    vue.config.js:
            module.exports = {
                  css: {
                    loaderOptions: {
                      postcss: {
                        plugins: [
                          require('postcss-pxtorem')({  // 此处配置 postcss-pxtorem
                            rootValue: 32, // 换算的基数(设计图750的根字体为32)
                            selectorBlackList: ['weui', 'mu'], // 忽略转换正则匹配项
                            propList: ['*']
                          })
                        ]
                      }
                    }
                  },
                  configureWebpack: config => {
                    if (process.env.NODE_ENV === 'production') {
                      // 为生产环境修改配置...
                    } else {
                      // 为开发环境修改配置...
                    }
                  }
                }
注: 
 1、不想px转rem的地方 使用Px 或 PX
(vscode格式化自动转为小写px 还未研究)
 2、不想转化第三方ui库 在selectorBlackList中添加类名
    如此项目使用vant-ui 只需将van忽略:
        propList: ['*'],//不匹配的css属性
        selectorBlackList: ['.van'], 
postcss-pxtorem + js动态设置根元素字体大小
一般postcss-pxtorem 与 lib-flxible配合使用 也可以通过js控制根元素字体的方式
以下为使用js动态改变根字体 + postcss-pxtorem 使用
(function(doc, win) {
    var docEl = doc.documentElement,
        resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',     
        recalc = function() {
            var clientWidth = docEl.clientWidth;
            if (!clientWidth) return;
            //设定根以屏幕宽375做标准来制定
            docEl.style.fontSize = 10 * (clientWidth / 37.5) + 'px';
        };
    if (!doc.addEventListener) return;
    //适配手机翻转
    win.addEventListener(resizeEvt, recalc, false);
    doc.addEventListener('DOMContentLoaded', recalc, false);
})(document, window);

CommonsChunkPlugin

     https://segmentfault.com/a/1190000012828879

ProvidePlugin

vue开发时,我们可以将一个库通过vue的原型对象绑定在vue上
Vue.prototype._=lodash;
这样使用的时候可以直接 this.$_.xxx
如果绑定的库较多,会导致根组件过大,
而如果不通过Vue.prototype.xxx方式引入,就需要在每个需要当前库的文件中引入,工作量太大,
可以使用ProvidePlugin解决:
      new webpack.ProvidePlugin({
          $_: 'lodash',
      });
使用:
  $_.xxx 即可

providePlugin其实是创建一个全局对象,但是这个全局对象在template直接使用会有问题
因为vue的模板语法中不支持直接以$、_开头的自定义属性,避免与vue内部冲突
解决办法:
  1、使用$data.$_
  2、data中重命名后绑定
  3、在methods中绑定

使用provideplugin并不会减少打包体积,只是为了增强代码可读性和可维护性

相关问题

vue-cli项目在ie浏览器空白

是因为promise在ie浏览器中不支持导致的
1、使用 babel-polyfill
    安装: npm install babel-polyfill
    使用: webpack.base.config中入口处添加babel-polyfill
        app: ["babel-polyfill", "./src/main.js"]

webp格式的图片打包处理

某次打包项目发现有一个图片孤零零的在dist根目录下,
查找原因后得知,项目中没有针对webp格式的图片打包后所放路径做配置
 就是说没有告诉webpack 这个图片打包后放在哪 改配置即可
当前项目环境 vue-cli2
打开项目build/webpack.base.conf.js 
找到 module/rules添加webp格式的配置以及打包后存放的路径
    {
        test: /\.webp$/i,
        loader: "file-loader",
        options: {
          //此处为了测试随意起了一个 webpImg 文件夹 根据项目配置
          name: utils.assetsPath('webpImg/[name].[hash:10].[ext]') 
        }
      }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容