Skip to content

GitLab

  • Projects
  • Groups
  • Snippets
  • Help
    • Loading...
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
T treasure
  • Project overview
    • Project overview
    • Details
    • Activity
    • Releases
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 12
    • Issues 12
    • List
    • Boards
    • Labels
    • Service Desk
    • Milestones
  • Merge requests 0
    • Merge requests 0
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Operations
    • Operations
    • Incidents
    • Environments
  • Packages & Registries
    • Packages & Registries
    • Container Registry
  • Analytics
    • Analytics
    • CI/CD
    • Repository
    • Value Stream
  • Wiki
    • Wiki
  • External wiki
    • External wiki
  • Snippets
    • Snippets
  • Members
    • Members
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • FE
  • treasure
  • Issues
  • #2

Closed
Open
Created Jul 21, 2020 by JayChen@JayChenOwner

前端工程优化总结

前端工程优化总结

已后台为例

背景

本地启动项目很慢,影响开发体验及效率

优化

cdn + webpack externals

在工程中, import Vue from 'vue', 此处引入的是node_modules下的vue包。 现在我们要使用cdn上的vue.min.js:

  1. script引入vue
  2. webpack中配置externals

externals中配置的时候,需知道vue在window上挂在哪个上,不一定就是包的名字。

modules.exports = {
  externals: {
    vue: 'Vue',
    vuex: 'Vuex',
    'vue-router': 'VueRouter',
    'element-ui': 'ELEMENT',
  },
}

比如vue挂在window的Vue上。webpack中,会自动把vue包名指向window上对应的变量。

脚本引入工具

为了能够按需加载,项目中将提供了getScript方法,在需要引入的地方,调用此方法,引入js。

import libsMap from '../enums/libsMap';
/**
 * 加载cndjs库
 * 挂载在Vue上,可通过this.$getScript(libName)
 * @export
 * @param {*} libName libsMap.js中的js库名
 * @returns
 */
export function getScript(libName) {
  return new Promise((resolve, reject) => {
    let script = document.createElement('script');
    let libSrc = libsMap[libName];
    if (!libSrc) {
      reject(`lib '${libName}' not defined`);
    }
    script.src = libSrc;
    script.onload = () => {
      resolve();
      document.body.removeChild(script);
    };
    script.onerror = () => {
      reject();
      document.body.removeChild(script);
    };
    document.body.appendChild(script);
  });
}

对应的,也提供了getCss方法

import libsMap from '../enums/libsMap';
/**
 * 加载cndjs库
 * 挂载在Vue上,可通过this.$getCss(libName)
 * @export
 * @param {*} libName libsMap.js中的库名
 * @returns
 */
export function getCss(libName) {
  if (!libName) {
    return
  }
  return new Promise((resolve, reject) => {
    let libSrc = libsMap[libName];
    let link = document.createElement('link');
    if (!libSrc) {
      reject(`lib '${libName}' not defined`);
    }
    link.type='text/css';
    link.rel = 'stylesheet';
    link.href = libSrc;
    link.onload = () => {
      resolve();
    };
    link.onerror = () => {
      reject();
    };
    document.querySelector('head').appendChild(link);
  });
}

按需引入js

在使用第三方库之前,加载对应的js,避免报错,可以使用async/await。

//比如
(async function() {
  getCss('videoJsCss')
  await getScript('videoJs')
  await getScript('videoPlayer')
  Vue.use(window.VueVideoPlayer)
})()

babel增加缓存

var webpackConfig = {
  module:{
    rules:{
      test: /\.js$/,
      loader: 'babel-loader?cacheDirectory',
    }
  }
}

vue-loader.conf.js sourcemap移除

webpack.dev.conf.js

element-ui/lib/theme-chalk/index.css 外链引入

const autoprefixer = require('autoprefixer');

module.exports = merge(baseWebpackConfig, {
  mode:'development',//不会 tree shaking 和代码压缩
  module: {
    rules: [
      {
        test:/\.(scss|css)$/,
        use:[
          'vue-style-loader',
          'css-loader',
          {
            loader: 'postcss-loader',
            options: {
              plugins: [
                autoprefixer({
                  overrideBrowserslist:[
                    "Android 4.1",
                    "iOS 7.1",
                    "Chrome > 31",
                    "ff > 31",
                    "ie >= 8"
                  ]
                }),
              ].filter(Boolean)
            }
          },
          'sass-loader',
        ]
      }
    ]
  },
})

eslint增加配置化,不默认开启

开发时可以先不开启,最后需要校验时再开启

后面需要再优化的(时间原因)

cdn+按需引入

工程中,存在一部分包,仅在部分页面使用,没必要打入app.js中,比如echarts。

lodash的优化

lodash可以按需引入,通常可能会这么引入 import _ from 'lodash'。如果使用部分方法,则建议使用 import _find from 'lodash/find.js'。

node_modules/element-ui/src/utils 所有引用拆除

可以通过自己写一个类似的方法即可,不需要引用element的, 后面需要全部拆出

vue-cli2.0产物整体迁移到 vue-cli4.+

总结

工程优化优化好处多多
  如:
    1、减轻包体积,加快项目启动及构建速度
    2、缓存公共包,避免因为一次迭代,在app.hash.js 变更后,导致的缓存失效,用户重新拉取资源缓存
    3、减少首页白屏时间,可以让用户更快的触达讯息

目前只是一个简单规划,大家可以提一些自己的建议和想法,
Assignee
Assign to
None
Milestone
None
Assign milestone
Time tracking