构建多页面应用——优化(二)

最近,一直尝试使用webpack做多页面应用的开发。并且一个实际的项目为原型,实现对一个静态的企业站进行优化。原站点地址,测试站点地址

如果想要做一个自己个个人博客,或者企业官网来说,有一定的参考意义。

webpack的resolve.alias

在做模块化开发的过程中,有一个需要解决的问题就是引用模块的路径问题。

注:在webpack中,每一个文件(不管是js,css, html,还是图片等)都被称之为一个块。

为了实现模块化,细粒度化的控制,往往会将代码块分成为不可分割的块,这样做虽然方便了管理控制,但是也会造成项目的文件嵌套很严重,再饮用的时候需要格外小心路径,同时也会造成开发者的负担(抛开其他不讲,但从技术角度来说,对于开发人员来说,能用一行代码解决的问题,绝不用两行,能少输入一个单词就少输入一个)。

而webpack的resolve.alias可以为指定路径的字符串起别名。在本文所使用的示例,这样定义别名:

...
resolve: {
  alias: {
    '@': path.join(__dirname, '..', 'pages/'), // 根目录
    '@css': path.join(__dirname, 'assets/css/'), // css
    '@img': path.join(__dirname, 'assets/imgs/'), // picture
    // '@font': path.join(__dirname, 'assets/fonts/'),
    '@data': path.join(__dirname, 'pages/data/'), // mock data
    '@utils': path.join(__dirname, 'pages/utils/') // snippets code
  }
},
...

当然,上面的别名并不是万能的,有一个问题就是background-iamgefont-face 的使用url()会有一些问题,url()中的路径必须是字符串,暂时没有好的办法解决。

但是使用sass,可以定义变量,可以通过变量来指定路径,但是要严格控制引用变量模块的文件的目录,在本文所使用的示例中,统一将应用变量文件assets/css/path.scss的文件,控制在两个层级。具体可参考所提供源代码中的具体使用。

模拟数据

实际的项目没有使用任何一种语言的后端代码,更不用说数据库。全部使用的是模拟数据。

为了方便管理维护项目的模拟数据,将项目的所有数据统一整理到了示例pages/data目录下。

静态资源图片的处理

第一优化的时候,就简单的讲了下,如何使用imagemin提供的插件,来实现对常见类型(.jpg,.png,*.gif)图片的处理。

第一种引用图片的方案

之前做单页面应用开发的时候,喜欢将所有的图片优化处理后统一放在一个目录中,然后将它们放在服务器中,最后在开发或生产环境中,使用绝对路径进行访问。

这种方式的好处是不用担心相对路径造成的路径问题。但是缺点是,操作起来不方便,尤其是开发环境。因为你不知道项目究竟要使用多少的静态资源,尤其是使用哪种静态资源。

这种方式在团队合作的项目中,比较常见,但是对于提升团队的效率并不明显。

第二种引用图片的方案

所以,对于开发者来说,如果如果需要什么静态资源,就放在自己的本地目录,这样可以随心所欲的添加。

在本文所采用的示例中,我做了一些尝试,将所有的图片资源进行了分类。需要转化为base64的图片放一个文件夹assets/imgs/base64/,需要合成雪碧图的单独放在一个文件夹;assets/imgs/sprites/,为了方便管理合成不同雪碧图的源图片,我又在该目录下创建了子文件夹;而对于<img src="..." />要引用的图片的存放使用了两个文件夹,assets/imgs/static存放了未经优化的所有的图片,而目录assets/imgs/others,存放了所有优化过的图片(包含两部分,一部分是使用npm run img命令优化的assets/imgs/static目录下的图片,另一部分是npm run dev命令优化的雪碧图图片,它的前缀带有*-sprite这样的后缀)。

这种方案,使用的是相对路径应用图片。可参考pages/data/contactus.js文件的代码:

const loadImg = require('@utils/load-img')

module.exports = {
  cn_name: '联系我们',
  en_name: 'CONTACT US',
  img: loadImg('second/contactus-tag.png'),
  ...
}

而工具代码片段loadImg的代码如下:

module.exports = function(str) {
  return require('@img/other/' + str)
}

源代码

webpack4.x multi-page

构建多页面应用系列文章

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容