项目作者: loveonelong

项目描述 :
:fire: 基于vue-template-webpack改造的vue模板,用于快速开发,像流星一样的速度。
高级语言: JavaScript
项目地址: git://github.com/loveonelong/vue-template-meteor.git
创建时间: 2017-12-20T08:17:15Z
项目社区:https://github.com/loveonelong/vue-template-meteor

开源协议:

下载






travis

快速开发,如同流星一样快速!

基于vue init webpack改造 https://github.com/vuejs-templates/webpack

站在巨人的肩膀上

本项目参考了以下项目代码

技术清单

  • vue-router
  • vuex
  • sass
  • svg-sprite
  • axios

该模板做的一些准备

  • 在html中增加了一些常用meta头,favico,设置lang=”zh”
  • 使用vue-router,axios,vuex,router按需加载,vuex使用module,axios进一步封装为api
  • 使用sass预处理器,全局变量等设置到config/*.scss中,使用时不用再@import引入
  • 预设组件icon-svg,支持SVGSprite,将所需要用到的svg放到src/icons/svg目录下即可
  • 优化vender,vue/vue-router/axios/vuex使用bootCDN(你可以替换为别的)

Usage

fork/git clone/download 本仓库(不要忘记把本仓库.git目录删掉)

  1. # install dependencies
  2. npm install
  3. # dev
  4. npm run dev
  5. # build for production
  6. npm run build
  7. # build for production and view the bundle analyzer report
  8. npm run build --report

优化&配置教程

这些为该模板做的一些改动说明,不用重复操作

src下的目录划分

  1. - api 经过封装的api接口
  2. - assets 一些静态资源
  3. - components 组件
  4. - svgIcons svg icons
  5. - style 开发时用到的配置(cssreset/cdn...)
  6. - pages 页面(每个页面一个单独的目录,页面之间的层级关系以此体现,私有组件平铺在该页面下)
  7. - router vue-router
  8. - store vuex
  9. - utils 工具类
  10. * App.vue
  11. * main.js

使用vue-runtime

当使用 vue-loader 或 vueify 的时候,*.vue 文件内部的模板会在构建时预编译成 JavaScript。你在最终打好的包里实际上是不需要编译器的,因为只是用运行时构建即可。

因为运行时构建相比完整版缩减了 30% 的体积,你应该尽可能使用这个版本。

在使用vue init webpack的时候选中vue-runtime only就可以了

参考:https://cn.vuejs.org/v2/guide/installation.html#术语

也可以手动配置

  1. // 修改webpack.base.conf.js中的
  2. alias: {
  3. 'vue$': 'vue/dist/vue.esm.js', // 去掉这句
  4. }
  1. // 修改main.js中
  2. new Vue({
  3. el: '#app',
  4. render: h => h(App)
  5. })

vue-router,axios,vuex

  1. npm install --save vue-router axios qs vuex
  • qs 用来序列化data

具体配置请查看 api/router/store 三个目录下的文件,及main.js

sass,sass-resources-loader

  1. npm install --save-dev node-sass sass-loader css-loader sass-resources-loader

sass-resources-loader 将指定sass文件全局注入,在别的sass样式中无需再@import

配置方法:

  1. /* 找到build目录下的utils.js 添加如下修改 */
  2. /* step 1 添加如下代码 */
  3. function resolveResouce(name) { // 用于配置全局引入的sass的目录
  4. return path.resolve(__dirname, '../src/style/' + name);
  5. }
  6. function generateSassResourceLoader() {
  7. var loaders = [
  8. cssLoader,
  9. // 'postcss-loader',
  10. 'sass-loader',
  11. {
  12. loader: 'sass-resources-loader',
  13. options: {
  14. // 这里是希望全局引入的具体的sass文件,可以自行指定
  15. resources: [resolveResouce('vars.scss'), resolveResouce('mixins.scss')]
  16. }
  17. }
  18. ];
  19. if (options.extract) {
  20. return ExtractTextPlugin.extract({
  21. use: loaders,
  22. fallback: 'vue-style-loader'
  23. })
  24. } else {
  25. return ['vue-style-loader'].concat(loaders)
  26. }
  27. }
  28. /* step 2 修改该文件中的return */
  29. sass: generateSassResourceLoader(),
  30. scss: generateSassResourceLoader(),

svg-sprite-loader用法

用于将svg合成svg雪碧图

在src下新建svgIcons目录,结构如下

  1. - svgIcons
  2. - svg 放置所有的svg
  3. - template 放置svg-icon模板
  4. * index.js export
  1. npm install --save-dev svg-sprite-loader
  1. /* 在build/webpack.base.conf.js添加 */
  2. {
  3. test: /\.svg$/,
  4. loader: 'svg-sprite-loader',
  5. include: [resolve('src/svgIcons')],
  6. options: {
  7. symbolId: 'icon-[name]'
  8. }
  9. }
  10. /* 为了避免跟默认配置冲突,添加exclude */
  11. {
  12. test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
  13. loader: 'url-loader',
  14. exclude: [resolve('src/svgIcons/svg')], // add exclude
  15. options: {
  16. limit: 10000,
  17. name: utils.assetsPath('img/[name].[hash:7].[ext]')
  18. }
  19. }

为了避免需要将svg icons一个个地引入,使用webpack中的require.context()

  1. /* src/SvgIcons/index.js */
  2. const requireAll = requireContext => requireContext.keys().map(requireContext)
  3. const req = require.context('./svg', false, /\.svg$/)
  4. requireAll(req)
  5. /* 在main.js引入svgIcons */
  6. // ...
  7. (() => import(/* webpackChunkName: "svgIcon" */ './svgIcons'))() // 将svg单独打包
  8. // ...

优化vender,使用bootCDN

vender打包后会变得非常巨大,并且一旦我们改动/升级了某个库,用户就需要重新下载整个vender,不能更好的利用缓存。

为了不影响我们本地开发和使用vue-devtools,copy一份index.html,并重命名为index.dev.htmlindex.prod.html

修改webpack.dev.conf.jswebpack.prod.conf.js中的配置为相对应的html

  1. /* webpack.dev.conf.js */
  2. new HtmlWebpackPlugin({
  3. //...
  4. template: 'index.prod.html',
  5. //...
  6. )}
  7. /* webpack.prod.conf.js */
  8. new HtmlWebpackPlugin({
  9. //...
  10. template: 'index.prod.html',
  11. //...
  12. )}

webpack.prod.config.js中配置webpack的externals

  1. /* webpack.prod.conf.js中配置 */
  2. externals: {
  3. vue: 'Vue',
  4. 'vue-router': 'VueRouter',
  5. vuex: 'Vuex',
  6. axios: 'axios'
  7. }

index.prod.html中添加这些库对应的cdn

  1. <script src="//cdn.bootcss.com/vue-router/3.0.1/vue-router.min.js"></script>
  2. <script src="//cdn.bootcss.com/vuex/3.0.1/vuex.min.js"></script>
  3. <script src="//cdn.bootcss.com/axios/0.17.1/axios.min.js"></script>
  4. <-- vue runtime -->
  5. <script src="//cdn.bootcss.com/vue/2.5.9/vue.runtime.min.js"></script>

组件命名

组件名应至少为两位

在template中的组件应使用kebab-case的形式,没有slot的组件应当自闭合

例如:<AppHeader ></AppHeader>

命名参考

  • 全局组件 AppFoo 例如:AppHeader、AppFooter
  • 基础组件 BaseFoo 例如:BaseButtonBlue、BaseLink
  • 单例组件 TheFoo 每个页面只使用一次。这些组件永远不接受任何 prop 例如:TheAboutUs
  • 耦合紧密组件 FooBar 例如:PersonalAvartarUploadButton

vue 用户自定义代码片段(根据vue官方推荐的顺序排列)

  1. {
  2. "template": {
  3. "prefix": "vue",
  4. "body": [
  5. "<template>",
  6. "",
  7. "</template>",
  8. "",
  9. "<script>",
  10. "export default{",
  11. " name: '',",
  12. " components: {},",
  13. " mixins: {},",
  14. " props: {},",
  15. " data () {",
  16. " return {}",
  17. " },",
  18. " computed: {},",
  19. " watch: {},",
  20. " created () {},",
  21. " mounted () {},",
  22. " methods: {}",
  23. "}",
  24. "</script>",
  25. "",
  26. "<style lang=''>",
  27. "",
  28. "</style>",
  29. ""
  30. ]
  31. }
  32. }