WebApp

一、项目准备

  1. 项目结构
  • compnents文件夹 存放整个项目公共的组件 主要写的是功能和样式
  • assets文件夹 存放样式和字体图标
  • api文件夹 存放请求文件
  • pages文件夹存放项目页面
  • pages文件夹中没有个页面中conponents 存在的是页面级的公共组件 写的是html结构
    1、搭建环境
  • npm init 初始化项目
  • npm install --save-dev css-loader@4.2.1 style-loader@1.2.1 file-loader@6.0.0 url-loader@4.1.0 安装开发依赖
  • npm install art-template@4.13.2 swiper@6.1.1 安装线上依赖
  • "start": "webpack-dev-server --open chrome" 修改scripts属性值
  • 配置webpack.config.js文件
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

// 获取绝对路径
const resolve = dir => path.resolve(__dirname, dir);

module.exports = {
  mode: 'development',
  // Webpack 入口文件
  entry: {
    index: './src/pages/index',
    destination: './src/pages/destination'
  },
  // Webpack 输出路径
  output: {
    // 输出的目录
    path: resolve('dist'),
    // 输出的文件名
    filename: 'js/[name].js'
  },
  // source-map,调试用的,出错的时候,将直接定位到原始代码,而不是转换后的代码
  devtool: 'cheap-module-eval-source-map',
  resolve: {
    // 自动补全(可以省略)的扩展名
    extensions: ['.js'],
    // 路径别名
    alias: {
      api: resolve('src/api'),
      icons: resolve('src/assets/icons'),
      styles: resolve('src/assets/styles'),
      components: resolve('src/components'),
      pages: resolve('src/pages'),
      utils: resolve('src/utils')
    }
  },
  // 不同类型模块的处理规则
  module: {
    rules: [
      // css
      {
        test: /\.css$/,
        use: ['style-loader', 'css-loader']
      },
      // 模板文件
      {
        test: /\.art$/,
        loader: 'art-template-loader'
      },
      // 图片
      {
        test: /\.(png|jpe?g|gif|svg)$/,
        loader: 'url-loader',
        options: {
          // 小于 10K 的图片转成 base64 编码的 dataURL 字符串写到代码中
          limit: 10000,
          // 其他的图片转移到
          name: 'images/[name].[ext]',
          esModule: false
        }
      },
      // 字体文件
      {
        test: /\.(woff2?|eot|ttf|otf)$/,
        loader: 'url-loader',
        options: {
          limit: 10000,
          name: 'fonts/[name].[ext]'
        }
      }
    ]
  },
  plugins: [
    // 自动将依赖注入 html 模板,并输出最终的 html 文件到目标文件夹
    new HtmlWebpackPlugin({
      filename: 'index.html',
      template: './src/pages/index/index.art',
      chunks: ['index']
    }),
    new HtmlWebpackPlugin({
      filename: 'destination.html',
      template: './src/pages/destination/destination.art',
      chunks: ['destination']
    })
  ]
};

二、项目开发相关的笔记

1、html/body添加overflow:hidden;属性是为了解决获取scrollTop属性值存在的兼容性问题,防止出现页面出现滚动条。
2、js中引入对应的css文件,然后在art中引入其他模板文件,最后在index.js引入对应的js文件
3、幻灯片

  • index/index.art文件中引入幻灯片art模板 (替换为loading组件实现加载效果)
  • index/slider/index.js文件中引入slider.css文件 以及swiper组件提供的css和js文件
  • index/index.js文件中引入幻灯片组件
  • 使用ajax获取数据
    • 引入slider.art模板
    • 引入api/getData.js模块
    • 获取index.art文件中的元素,然后替换innerHTML属性值。
    • 将获取的数据传给slider模板


      image.png

      image.png

4、tabbar组件

  • 使用原始模板语法,通过传递参数控制tabbar激活样式


    image.png

5、返回顶部组件

  • 通过添加删除一个特殊类,控制元素的隐藏和显示,默认是隐藏的
  • image.png
  • 滚动条滚过一个页面的高度window.innerHeight时,显示按钮

6、代码优化:将header组件和返回顶部组件功能相同的代码,提取出来,封装为一个公共类
7、目的地页

  • 引入公共的searchbox组件,通过传递参数placeholder设置提示文字
  • text-shadow ???
  • tab和content组件中定义各自的方法,在父组件中调用
  • tab组件中定义两个方法:
    (1)一个是根据索引添加对应的active类名,设置特殊样式;


(2)一个是根据索引发送数据请求,不处理获取的数据,直接将结果返回出去即可。


image.png
  • content组件中,定义两个个方法
    (1)将获取的数据中填充到模板中


    image.png

(2)没有获取到数据时,显示loading组件


image.png
  • main组件中,通过事件代理,左侧列表绑定点击事件,在获取数据填充到content模板之前,先调用loading组件,提升用户体验


    image.png
  • 由于每次切换都会发送请求,但由于请求是异步的,先发送的请求不一定先返回数据,所以可能会导致bug出现。
    解决方式:使用abort方法终止上一次请求。


    image.png
  • 使用sessionStorage做缓存
  • 返回顶部,滚动超出content组件可视区域高度scrollContainer.offsetHeight,显示按钮
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。