webpack入门学习笔记09 —— 在项目中引入全局变量

1. 写在前面

在做项目的时候,我们可能会经常遇到这种场景:一个变量我在很多文件中都要用到。这变量可能是第三方包,或者是自己定义的一个工具类对象等。

比如在基于jQuery的多页面应用中,在每一个页面中都要使用到 jQuery对象 ;在单页面应用中,一个 消息提示框 在所有组件中都要用到。

这个时候我们应该怎么办,如果在所有页面中都引用这个变量的话,工作量比较大,而且对项目的维护也不是很友好。这篇博客就来讲解:如何高效便捷地引入全局变量。主要内容包括:

  • 使用 webpack模块 注册全局变量
  • 将变量暴露给 window对象 ,成为全局变量

我们jquery对象为例,讲解如何在基于webpack的项目中,注入全局变量。首先安装jquery包:

yard add jquery

2. 使用webpack模块注入全局变量

这里要特别注意一下,webpack是一个工具,可以帮助我们构建项目,在这个工具里面,有一个 同名模块,叫做 webpack ,我们今天就是要使用这个模块来给每一个页面或者组件注入一个对象。

配置的规则很简单,这里先给出 webpack.config.js 文件中的配置代码,然后再进行解释:

/* 节省篇幅,其他的配置信息忽已略 */
let Webpack = require('webpack')    // 引入webpack模块

module.exports = {
    plugins: [      // 这是一个插件,所以要在plugins属性中配置
        new Webpack.ProvidePlugin({
            $: 'jquery'
        })
    ],
}

这里将其他的配置规则省略了,如果你想看其他的配置规则,可以查看我的 GitHub仓库 - webpack-learning ,或者通过本文末尾的链接,跳转到我之前的博客中进行查看。

上述配置的作用是:给项目中的每一个文件,都注入一个对象 $ ,这个对象就是我们安装的jquery包。安装完成之后,在其他页面中无需引入,即可使用jQuery语法。比如某一个 .js 文件中书写以下代码:

console.log($)
console.log($(window));

项目启动之后,就会在控制台输出jquery对象和选择的window对象。由此可知,我们成功注册了一个全局变量。

3. 将变量暴露给 window对象 ,成为全局变量

从事前端开发的程序员都知道,JS的全局变量就是 window 对象的属性或方法,所以如果在项目中,如果我们能够把一个变量,设置成 window 对象的属性或者方法,那么它就成为了全局变量,就可以在其他文件中使用了。

想要达到这个目的,我们可以借助 expose-loader ,首先执行以下命令,进行安装:

yarn add expose-loader -D

expose-loader是一个 内联loader ,即可以字节在文件中使用,当然也可以在 webpack.config.js 配置文件中使用。我们先来讲解如何在文件中使用这一loader。

现在假设项目中有一个 index.js 文件,我们在这个文件中将 $对象 暴露给 window 对象,使之成为全局变量,那么可以书写以下代码:

import $1 from 'expose-loader?$!jquery' // 引入jquery对象,并将该对象暴露给window的$属性

console.log($1)
console.log(window.$);

可能上面的代码你看着有些头晕,我来讲解一下:

  1. 首先通过 import 命令,从安装的jquery包中导入一个对象,将这个对象命名为 $1$1 不是全局对象。
  2. 通过 expose-loader?$!jquery 命令,从安装的jquery模块中导入一个对象,将这个对象添加到 window 对象的 $ 属性上。这样一来,就得到了一个全局变量 window.$ ,即 $

如果你不喜欢在文件使用内联loader设置全局对象,那么可以在 webpac.config.js 文件中,进行配置,配置代码如下:

module.exports = {
    module: {
        rules: [{
                test: require.resolve('jquery'),    // 匹配到引入jquery的文件
                use: 'expose-loader?$'              // 使用 expose-loader 进行处理
            }
        ]
    }
}

然后你就可以在 index.js 文件中正常地引入jquery包,webpack会来使用 expose-loader 自动帮我们暴露全局变量。 index.js 文件代码参考如下:

import $1 from 'jquery'     // 正常导入jquery包

console.log($1)
console.log(window.$);

这样设置之后,在其他的 .js 文件中,就无须再导入jquery,方便快捷。

4. 写在后面

上面介绍了两种设置全局变量的方式,就我个人来说,比较喜欢第一种,大家可以根据需要和喜好,自行选择。

这就是本篇博客的全部内容了,大家加油,学懂webpack!

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

推荐阅读更多精彩内容