art-template渲染分页模板

2023-11-18

//环境:简单webpack环境

webpack.config.js

const path = require('path')

const HtmlWebpackPlugin = require('html-webpack-plugin')

 

const VueLoaderPlugin = require('vue-loader/lib/plugin') // 引入这行

 

const webpack = require('webpack')

const ExtractTextWebpackPlugin = require('extract-text-webpack-plugin')

 

//将css样式单独抽离成一个文件

let MiniCssExtractPlugin = require('mini-css-extract-plugin');


 

//添加optimize-css-assets-webpack-plugin插件,与uglifyjs-webpack-plugin插件

let OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');

let UglifyJsPlugin = require('uglifyjs-webpack-plugin')

 

const isDev = process.env.NODE_ENV === 'development'

 

const config = {

  mode: 'development',

  entry: path.join(__dirname, './src/index.js'),

  output: {

    filename: 'bundle.js',

    //路径必须是一个绝对路径

    path: path.resolve(__dirname, 'dist')

  },

 

  optimization: { //优化项

    minimizer: [

      new UglifyJsPlugin({

        cache: true,

        parallel: true,

        sourceMap: true

      }),

      new OptimizeCSSAssetsPlugin()

    ],

  },

 

  plugins: [

    //process.env.NODE_ENV = development 为一个变量报错

    new webpack.DefinePlugin({

      'process.env': {

        NODE_ENV: isDev ? '"development"' : '"production"' //Or JSON.stringify('development')

      }

    }),

    //js打包后自动插入模板

    new HtmlWebpackPlugin({

      filename: 'index.html',

      template: path.resolve(__dirname, './src/index.html'),

      minify: {

        removeAttributeQuotes: true,

        collapseWhitespace: true

      },

      hash: true

 

    }),

    new VueLoaderPlugin(),

 

    new MiniCssExtractPlugin({

      filename: '[name].css',

      chunkFilename: '[id].css',

    })

  ],

 

  module: {

    //规则 css-loader 解析类似import这种语法的语句

    //style-loader 把css插入到head标签中

    //loader的用法:字符串只用一个loader

    //loader的特点:单一

    //多个loader,需要[]

    //loader顺序,从右向左,从下到上执行

    //loader还可以写出对象方式

    rules: [{

        test: /\.vue$/,

        loader: 'eslint-loader',

        exclude: /node_modules/,

        enforce: 'pre'

      },

      {

        test: /\.vue$/i,

        use: ['vue-loader']

      },

      {

        test: /\.jsx$/,

        loader: 'babel-loader'

      },

 

      {

        test: /\.js$/,

        loader: 'eslint-loader',

        enforce: "pre",

        include: [path.resolve(__dirname, 'src')], // 指定检查的目录

        options: { // 这里的配置项参数将会被传递到 eslint 的 CLIEngine

          formatter: require('eslint-friendly-formatter') // 指定错误报告的格式规范

        }

      },

      {

        test: /\.js$/i,

        use: {

          loader: 'babel-loader',

          options: {

            presets: [

              '@babel/preset-env'

            ],

            plugins: [

              //注意插件顺序

              ["@babel/plugin-proposal-decorators", {

                "legacy": true

              }],

              //https://www.npmjs.com/package/@babel/plugin-proposal-class-properties

              ["@babel/plugin-proposal-class-properties", {

                "loose": true

              }],

              //https://babeljs.io/docs/en/babel-plugin-transform-runtime#docsNav

              "@babel/plugin-transform-runtime",


 

            ],

            include: path.resolve(__dirname, 'src'),

            exclude: /node_modules/

          }

        }

      },

      {

        test: /\.css$/,

        use: [

          // 'style-loader',

          MiniCssExtractPlugin.loader,

          'css-loader',

          'postcss-loader', //给css样式添加浏览器前缀 -moz- ...

        ]

      },

 

      {

        test: /\.(jpg|jpeg|png|svg|gif)$/i,

        use: {

          loader: 'url-loader',

          options: {

            name: '[name].[ext]',

            limit: 10 * 1024

          }

        }

 

      },

 

      {

        test: /\.scss$/i,

        use: [

          // 'style-loader',

           MiniCssExtractPlugin.loader,

           {

            loader:'css-loader',

              options:{

                importLoaders:1

              }

          },

          // {

          //   loader: 'postcss-loader',

          //   options: {

          //     // nables source map support, postcss-loader will use the previous source map given by other loaders and update it accordingly,

          //     // if no previous loader is applied before postcss-loader, the loader will generate a source map for you.

          //     sourceMap: true

          //   }

          // },

 

          {

            loader: "postcss-loader",

            options: {

              ident: 'postcss',

              plugins: [

                require('autoprefixer')({

                  'browsers': ['> 1%', 'last 2 versions']

                }),

              ]

            }

          },


 

          'sass-loader'

        ]

 

      },



 

        {

 

          test: /\.art$/,

 

          loader: 'art-template-loader'

 

      }


 

    ]

  }

}

 

if (isDev) {

  config.module.rules.push({

    test: /\.styl(us)?$/, //rules里面修改下匹配styl的正则表达式,文件内写的lang是等于"stylus"的

    use: [

      'style-loader',

      'css-loader',

      {

        loader: 'postcss-loader',

        options: {

          //nables source map support, postcss-loader will use the previous source map given by other loaders and update it accordingly,

          //if no previous loader is applied before postcss-loader, the loader will generate a source map for you.

          sourceMap: true

        }

      },

      'stylus-loader'

    ]

  })

  config.devtool = '#cheap-nodule-eval-source-map' //webpack官方推荐

  config.devServer = {

    port: 8888,

    contentBase: './build', //指定目录

    progress: true, //打包时显示进度条

    // open:true, //打包后自动打开浏览器

    host: '0.0.0.0', //可localhost、可IP及手机连接wifi访问等等

    compress: true,

    overlay: {

      warnings: true,

      errors: true

    },

    hot: true //热替换

  }

 

  config.plugins.push(

    new webpack.HotModuleReplacementPlugin(),

    new webpack.NoEmitOnErrorsPlugin()

  )

} else {

  config.output.filename = '[name].[chunkhash:8].js' //开发环境会报错

  config.module.rules.push({

    test: /\.styl(us)?$/,

    use: ExtractTextWebpackPlugin.extract({

      fallback: 'style-loader',

      use: [

        'css-loader',

        {

          loader: 'postcss-loader',

          options: {

            //nables source map support, postcss-loader will use the previous source map given by other loaders and update it accordingly,

            //if no previous loader is applied before postcss-loader, the loader will generate a source map for you.

            sourceMap: true

          }

        },

        'stylus-loader'

      ]

    })

  })

 

  config.plugins.push(

    new ExtractTextWebpackPlugin({

      //因为webpack4包含了contenthash这个关键字段,所以extarct-text-webpack-plugin中不能使用contenthash

      //解决:使用md5:contenthash:hex:8替代

      // filename:'styles.[contentHash:8].css'

      filename: 'styles.[md5:contenthash:hex:8].css'

    })

  )

}


 

module.exports = config

 

// 构建分页逻辑所需要的数据(代码来自慕课网某课程)

// art-template的使用原则:不要在里面拼接大段的HTML代码。

// 类似本利中的分页组件,最好是构造一份适合Handlebars的数据,然后传给它,来生成html。

formatPag.js

const formatPag = function (pagData) {

  var arr = []

  var total = parseInt(pagData.totalCount)

  var cur = parseInt(pagData.curPage)

  // 处理首页的逻辑:<<

  var toLeft = {}

  toLeft.index = 1 // index代表点击按钮的时候可以跳转到的页面

  toLeft.text = '&laquo;' // text代表button的文本

  if (cur !== 1) {

    toLeft.clickable = true

  }

  arr.push(toLeft)

  // 处理到上一页的逻辑

  var pre = {}

  pre.index = cur - 1

  pre.text = '&lsaquo;'

  if (cur !== 1) {

    pre.clickable = true

  }

  arr.push(pre)

 

  var pag

 

  // 处理到cur页前的逻辑

  if (cur <= 5) {

    for (var i = 1; i < cur; i++) {

      pag = {}

 

      pag.text = i

 

      pag.index = i

 

      pag.clickable = true

 

      arr.push(pag)

    }

  } else {

    // 如果cur>5,那么cur前的页要显示为...

    pag = {}

 

    pag.text = 1

 

    pag.index = 1

 

    pag.clickable = true

 

    arr.push(pag)

 

    pag.text = '...'

 

    arr.push(pag)

 

    // 当前页前面2个页数显示出来

 

    for (var j = cur - 2; j < cur; j++) {

      pag = {}

 

      pag.text = j

 

      pag.index = j

 

      pag.clickable = true

 

      arr.push(pag)

    }

  }

 

  // 处理当前页

  pag = {}

 

  pag.text = cur

 

  pag.index = cur

 

  pag.cur = true

 

  arr.push(pag)

 

  // 处理cur页后的逻辑

 

  if (cur >= total - 4) {

    for (var k = cur + 1; k <= total; k++) {

      pag = {}

 

      pag.text = k

 

      pag.index = k

 

      pag.clickable = true

 

      arr.push(pag)

    }

  } else {

    // 如果cur < total - 4, 那么cur后的页面显示为...

 

    // 显示以当前页后面的2个页数

 

    for (var m = cur + 1; m <= cur + 2; m++) {

      pag = {}

 

      pag.text = m

 

      pag.index = m

 

      pag.clickable = true

 

      arr.push(pag)

    }

 

    pag = {}

 

    pag.text = '...'

 

    arr.push(pag)

 

    pag = {}

 

    pag.text = total

 

    pag.index = total

 

    pag.clickable = true

 

    arr.push(pag)

  }

 

  // 处理到下一页的逻辑

 

  var next = {}

 

  next.index = cur + 1

 

  next.text = '&rsaquo;'

 

  if (cur !== total) {

    next.clickable = true

  }

 

  arr.push(next)

 

  // 处理到尾页的逻辑

 

  var toRight = {}

 

  toRight.index = total // index代表点击按钮的时候可以跳转到的页面

 

  toRight.text = '&raquo;' // text代表button的文本

 

  if (cur !== total) {

    toRight.clickable = true

  }

 

  arr.push(toRight)

 

  return arr

}

 

export default formatPag

 

//page.art

<ul>
    {{if data && data.length>0}}
    {{each data}}
    <li data-id={{$value.index}} {{if $value.cur}} class="cur" {{/if}} {{if $value.clickable}} class="clickable" {{/if}}>{{# $value.text}}</li>
    {{/each}}
     {{else }}
        {{/if}}
</ul>

 

//page.js

const $ = require('jquery');

const page = require('./page.art');

$.getJSON('http://imoocnote.calfnote.com/inter/getClasses.php', {

    curPage: 1

}, function (data) {

 

    console.log(JSON.stringify(formatPag(data)));

    var html = page({"data":formatPag(data)});

    $("#page").html(html);

    

});

 

index.js

 

import Vue from 'vue'

import App from './app.vue'

// img.src = './meinv.png';就是一个普通字符串

import beauty from './images/profile.jpg'

// import axios from 'axios'

 

import formatPag from './formatPag.js'

 

require('@primer/css/buttons/index.scss')

require('@primer/css/utilities/index.scss')

require('./style/page.css')

 

const img = new Image()// 把图片引入,返回一个新的图片地址

img.src = beauty

 

const root = document.createElement('div')

document.body.appendChild(root)

 

document.body.appendChild(img)

 

const $ = require('jquery')

 

const page = require('./tpl/page.art')

 

console.log(formatPag)

 

$.getJSON('http://imoocnote.calfnote.com/inter/getClasses.php', {

  curPage: 1

}, function (data) {

  console.log(JSON.stringify(formatPag(data)))

  var html = page({ data: formatPag(data) })

  $('#pag').html(html)

})

 

new Vue({

  // 通过h把App组件挂载到html里面,这里只是声明了渲染的是组件App的内容,还需通过$mount挂载到html的一个节点上面

  render: (h) => h(App)

}).$mount(root)

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

art-template渲染分页模板 的相关文章

随机推荐

  • ACE_Proactor实现

    ACE Proactor实现了Facade模式 其方法可以分为四类 生命周期管理方法 事件循环管理方法 定时器管理方法 IO操作facilitator方法 须知ACE Proactor是使用Bridge模式的 ACE aynch Read
  • 内网安全-隧道搭建&穿透上线&FRP&NPS&Ngrok

    目录 环境介绍 内网穿透 Ngrok 入门 上线 tcp协议 内网穿透 Frp 简易型 上线 内网穿透 Nps 自定义 上线 环境介绍 实验目的 让msf上线外网 通常情况下 内网可以访问外网 但是外网无法访问到内网 所以外网的木马通常情况
  • 将二叉树转为有序的双向链表

    一 题目要求 输入一棵二叉排序树 现在要将该二叉排序树转换成一个有序的双向链表 而且在转换的过程中 不能创建任何新的结点 只能调整树中的结点指针的指向来实现 include
  • AHB to APB bridge

    目录 SPEC 验证框架图 测试点分解以及设计测试用例 测试点分解 设计测试用例 具体的Sequence及testcase Sequence testcase SPEC DUT如下 具体功能描述可参考ARM官方文档 AHB to APB s
  • 驾驭计算机视觉的翅膀:论文找代码的几种必杀技!

    摘要 对于CVer来说 代码和找代码 能力都是一种很重要的能力 毕竟idea再好只有通过代码实现出来才能发文章和刷榜 当我们阅读一篇高质量或者英文论文时 如何去找到该文章实现的代码 进而结合文章内容和代码实现去更好的理解作者所做的工作 只有
  • 什么是MVC设计模式

    直接上图 其中model 和view大家经常写 就不说了 有人可能并不清楚controller 到底是啥 其实就是经常写的 data source delegate outlet什么的 先撇开那些乱七八糟的箭头单看他们之间的分界线 view
  • C# 中BindingSource 的用法

    C BindingSource 1 引言 BindingSource组件是数据源和控件间的一座桥 同时提供了大量的API和Event供我们使用 使用这些API我们可以将Code与各种具体类型数据源进行解耦 使用这些Event我们可以洞察数据
  • mac os 搭建fortran环境

    首先从App Store下载Xcode 然后安装命令行工具 终端下输入 xcode select install 然后终端下输入如下命令 安装Homebrew ruby e curl fsSL https raw githubusercon
  • 使用缺省的拷贝构造函数带来的危险性

    我此前另外一篇文章通过类String看拷贝构造函数 赋值函数的作用和区别 对于更深的拷贝构造函数讨论大家可以参见这篇帖子 C 类对象的复制 拷贝构造函数 通过编写类String的拷贝构造函数和赋值函数介绍了一些拷贝构造数 本文着重介绍拷贝构
  • 前端面试题有哪些,有没有前端面试题库?

    全篇干货总结前端跳槽面试必备技能 如何看待面试 如何准备面试 注意事项有哪些 面试各环节考察的是什么 一面 考察基础知识 二面 考察能力广度和深度 三面 考察项目业务能力 终面 hr面 考察沟通能力 性格 潜力等等 一面的基础知识 在这分享
  • java定义一个周长类三角形_point类 三点的三角形的周长、面积 编程求解矩形和圆面积 java 三角形的定义...

    三角形的定义 1 先创建一个Point类 然后定义Trianglele类 在Trianglele类中定义三个Point的实体来表示一个三角形的三个点 再定义构造方法对这三个点进行初始化 然后定义两个方法求三角形的周长 面积 定义一个测试类
  • 算法:点与点之间欧式距离最小

    2017 03 10 问 知道一堆点 如何求出其中距离最近的一对 按欧式距离 除了暴力求解 还有没有其他的办法 这个算是最笨的办法 复杂度也比较高 我在另外一个博客里看到 他是用分治法的方式进行处理 而且也指出这个算法的难点在于如何将各种情
  • YOLO,VOC数据集标注格式解析

    YOLO数据集txt标注格式 0 0 160938 0 541667 0 120312 0 386111 分别指所标注内容的类别 归一化后的中心点x坐标 归一化后的中心点y坐标 归一化后的目标框宽度w 归一化后的目标况高度h 此处归一化指的
  • Fildder无法抓不到Firefox的包

    起因 Firefox这个浏览器对开发者太友好了 开发者工具看着很清爽 功能也很实用 就安装来用这个浏览器做项目测试 某次开发中发现某个请求有些问题 想用强大的Fiddler来看下前端到底是怎么发送的请求 问题来了 Fildder死活抓不到f
  • 什么是网络空间测绘?到底有什么作用?

    据X视新闻客户端报道 当地时间4月18日 谷歌地图服务开始以最大分辨率提供俄罗斯所有军事和战略设施的卫星图像 目前 包括各种洲际弹道D弹发射井 指挥所 秘密试验场等在内的俄战略要地均可以每像素约0 5米的分辨率查看 随后 谷歌公司已否认了
  • 前端UI框架整理

    1 TDesign 腾讯最近刚刚公开的一套UI框架 个人感觉不错 桌面与移动端都有 下面是官网介绍 TDesign 是什么 TDesign 是腾讯各业务团队在服务业务过程中沉淀的一套企业级设计体系 TDesign 具有统一的 设计价值观 一
  • BLAM跑自己的数据包无法显示全局点云地图解决(速腾聚创RS-LiDAR-16 雷达 )-SLAM不学无术小问题

    BLAM算法跑自己的数据包无法显示全局点云地图解决 适配速腾聚创RS LiDAR 16 雷达 提示 本文笔者使用环境Ubuntu18 04 ROS melodic版本 首先放一个效果链接 由b站up VladimirDuan上传 非官方 官
  • linux打不开摄像头,linux opencv打不开摄像头

    配置 ubuntu16 04 opencv3 4 罗技c270 webcam 摄像头我在windows上测试了是没问题的 但是到了linux嵌入式板子上就不行了 灯一直不亮 一开始我以后是opencv的版本问题 换了最新版本的opencv
  • LegalAI领域大规模预训练语言模型的整理、总结及介绍(持续更新ing…)

    诸神缄默不语 个人CSDN博文目录 文章目录 1 通用大规模预训练语言模型 2 对话模型 3 分句 4 文本分类 5 信息抽取 6 案例检索 7 文本摘要 1 通用大规模预训练语言模型 英语 LegalBERT 原始论文 2020 EMNL
  • art-template渲染分页模板

    环境 简单webpack环境 webpack config js const path require path const HtmlWebpackPlugin require html webpack plugin const VueLo