Webpack4-使用expose-loader将变量注册到全局
首先贴一下 package.json中的插件版本,不同的版本也许会有很大的差异:
// package.json
{
"name": "WEBPACK-DEV-1",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"scripts": {
"dev": "webpack-dev-server",
"build": "webpack --config webpack.config.js"
},
"devDependencies": {
"@babel/core": "^7.14.6",
"@babel/preset-env": "^7.14.5",
"autoprefixer": "^8.0.0",
"babel-loader": "^8.2.2",
"css-loader": "^5.2.6",
"expose-loader": "0.7.5",
"html-webpack-plugin": "^4.2.1",
"less": "^4.1.1",
"less-loader": "^6.1.0",
"mini-css-extract-plugin": "^1.6.0",
"optimize-css-assets-webpack-plugin": "^4.0.0",
"postcss-loader": "^4.0.4",
"style-loader": "^2.0.0",
"uglifyjs-webpack-plugin": "^2.2.0",
"webpack": "^4.28.2",
"webpack-cli": "^3.1.2",
"webpack-dev-server": "^3.11.2"
},
"dependencies": {
"jquery": "^3.6.0"
}
}
拿jquery为例子,使用 yarn add jquery -S 安装jquery到项目里面,这时候可以通过require("jquery")来获取,但是使用window.jquery仍然是undefined,那么如何把jquery挂在全局变量window(浏览器环境)上呢?
在 webpack.config.js 的 module.rules 里面添加如下配置对象即可,然后引用的话就可以直接用了
// webpack.config.js
{
test: require.resolve('jquery'),
use:'expose-loader?$'
},
// index.js
var $ = require("jquery");
console.log('$,',$)
// expore-loader 暴露 全局的loader 内联的loader
// loader[pre:前面执行的loader,normal:普通的loader,liader:内联的loader,postloader:后置loader]
// 问:什么叫做内联的loader?
// 答:var $ = require("expose-loader?$!jquery");希望把jquery暴露出去,暴露为"$",暴露给全局上
console.log('内联window.$,',window.$)

完整webpack配置:
var path = require('path');
let HtmlWebpackPlugin = require('html-webpack-plugin')
let MiniCssExtractPlugin = require('mini-css-extract-plugin');
let OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin');//压缩.css文件
let UglifyjsWebpackPlugin = require('uglifyjs-webpack-plugin');//压缩js
module.exports = {
optimization:{//优化项
minimizer:[
new OptimizeCssAssetsWebpackPlugin(),
new UglifyjsWebpackPlugin({
cache:true,//启用缓存
parallel:true,//并发打包
sourceMap:true
})
]
},
mode: "production",//模式:production/development
entry: './src/index.js',
output: {
filename: "bundle.[hash:6].js", // 可以指定打包后的文件名不同,bundle.[hash:6].js 可以指定hash的长度
path: path.resolve(__dirname, 'build'),//路径必须是绝对路径
},
devServer: {
//开发服务配置
port: 3000,//端口
progress: true,//显示进度
contentBase: './build', //静态服务运行目录
compress: true,//压缩
},
plugins: [
new HtmlWebpackPlugin({
template: "./src/index.html",
filename: "index.html",
minify: {
removeAttributeQuotes: true,//把index.html双引号转化为单引号
collapseWhitespace: true,//折叠空行
},
hash: true,//文件添加hash戳,防止服务器环境缓存,比如apach或者nginx
}),
new MiniCssExtractPlugin({
filename: 'main.css',// 抽离出来的样式文件
})
],//webpack插件
module: {
rules: [
{
test:/\.js$/,
use:{
loader:'babel-loader',
options:{
presets:[ // 预设
"@babel/preset-env"
]
}
}
},
{
test: require.resolve('jquery'),
use:'expose-loader?$'
},
// 解析css,css-loader 主要负责解析@import.style-loader 把 css 插入到 head标签中
// loader 用法: 字符串
// 多个loader:数组,loader有顺序,从右向左执行
// {
// test: /\.css$/, use: [{
// loader: 'style-loader',
// options: {
// insert: function insertAtTop(element) {
// var parent = document.querySelector('head');
// // eslint-disable-next-line no-underscore-dangle
// var lastInsertedElement =
// window._lastElementInsertedByStyleLoader;
// if (!lastInsertedElement) {
// parent.insertBefore(element, parent.firstChild);
// } else if (lastInsertedElement.nextSibling) {
// parent.insertBefore(element, lastInsertedElement.nextSibling);
// } else {
// parent.appendChild(element);
// }
// // eslint-disable-next-line no-underscore-dangle
// window._lastElementInsertedByStyleLoader = element;
// },
// }
// }, 'css-loader']
// },
{
test: /\.css$/, use: [
MiniCssExtractPlugin.loader,
'css-loader',
'postcss-loader'
]
}
]
}
}
一定要注意版本!!!
Webpack4-使用expose-loader将变量注册到全局的更多相关文章
- Flask把变量注册到模板中
使用python的Flask框架时,参考<Flask Web开发>一书时,发现书中可以在全局使用Permission.FOLLOW变量. 但是自己在尝试是,确提示变量没有定义.经过搜索,找 ...
- Expose Loader & shit jquery
Expose Loader webpack https://github.com/xgqfrms/FEIQA/issues/31#issuecomment-418255126 require(&quo ...
- <转>MFC注册系统/全局热键。
<转>MFC注册系统/全局热键. 1. BEGIN_MESSAGE_MAP(CRS232TESTDlg, CDialog) //{{AFX_MSG_MAP(CRS232TESTDlg) O ...
- vue插件 使用use注册Vue全局组件和全局指令
插件一般会注册到全局使用 官方编辑插件介绍:https://vuefe.cn/v2/guide/plugins.html 全局组件: .首先建一个自定义组件的文件夹,比如叫loading,里面有一个i ...
- 在Form Load中设置showInTaskBar =false 或 隐藏窗口 this.Hide()时会导致注册的全局快捷键无效
在Form Load中设置showInTaskBar =false 或 隐藏窗口 this.Hide() 会导致注册的全局快捷键无效. 反正是其中一个,有点记不清了. 在Form Shown中s ...
- 使用gacutil把COM组件注册到全局缓存GAC中
我们在编写软件的时候,有时候需要调用COM组件,那就需要注册了,注册有两种,一种是使用regasm 在程序运行的时候注册,参考“pb调用C#编写的DLL类库“,不过受路径的限制.还有一种注册方式,使用 ...
- mappers:将sql映射注册到全局配置中
<!-- 将我们写好的sql映射文件(EmployeeMapper.xml)一定要注册到全局配置文件(mybatis-config.xml)中 --> <!-- 6.mappers: ...
- Vue全局弹窗:一次注册,全局可弹
Vue全局弹窗 今天来搞一个全局弹窗,不用每个文件都引入,只在main.js里作为全局原型引入就好了 先新建弹窗组件 toast.vue <template></template&g ...
- C#Winform 注册使用全局快捷键详解
C#.NET Winform 注册使用全局快捷键详解 借助于全局快捷键,用户可以在任何地方操控程序,触发对应的功能.但 WinForms 框架并没有提供全局快捷键的功能.想要实现全局快捷键需要跟 Wi ...
- 构建前端第12篇之---在Vue中对组件,变量,函数的全局引入
张燕涛写于2020-01-16 星期two 本篇还是源于import和export的使用,昨天看es6入门 和MDN文档,大体上用法了解了,但今天看ElementUI源码的时候,看到 //src/in ...
随机推荐
- SpringBoot定义异步任务类需要获取结果
注意点: 要把异步任务封装到类里面,不能直接写到Controller 增加Future<String>返回结果AsyncResult<String>("task执行完 ...
- Loggie Geek Camp 火热启动,社区大神带你玩开源
由开源构建的协作模式,正成为描绘数字蓝图.创造美好未来的主航道,中国工商银行.阿里云等组织已经在网易数帆"架构开发.内核开源"理念中与后者达成合作,来自华为.阿里云.中国移动.eB ...
- 洛谷P10693
洛谷P10693 好奇怪的题目编号 思路提取 input 11 2 13 4 5 3 7 9 9 11 11 12 output 9 以人造数据为例. 首先我们让\(i\)\(\to\)\(a_i\) ...
- jmeter forEach循环获取response参数值进行接口请求
jmeter forEach循环获取response参数值进行接口请求 注意: 一,ForEach控制器 输入变量前缀:输入正则表达式变量的引用名称即可 Start index for loop(ex ...
- Python和RPA网页自动化-处理alert弹框
以百度为例,分别使用python和RPA自动化完成以下步骤:设置->搜索设置->保存设置->确定 1.python代码如下 注意:[已经记录下您的使用偏好]弹框是无法捕获网页源代码的 ...
- 浪潮计算平台之AI方向——AI_Station开发环境的使用总结
概览: 1. 开发环境 使用默认的设置,不改挂载路径: 可以看到在容器内对挂载的目录进行文件操作是可以真实记录到实际的文件目录内的. 对挂载路径的另一种设置: 不使用默认的设置,手动更改挂载路径: ...
- 【Playwright+Python】系列教程(七)使用Playwright进行API接口测试
playwright也是可以做接口测试的,但个人觉得还是没有requests库强大,但和selenium相比的话,略胜一筹,毕竟支持API登录,也就是说可以不用交互直接调用接口操作了. 怎么用 既然是 ...
- vue开发者工具dev-tool的安装
1.下载网址:https://github.com/Redxym/dev-tools 2.谷歌浏览器->扩展程序,拖动刚刚下载好的压缩包,将chrome文件夹添加至'加载已解压的扩展程序' // ...
- 2023 年上海市大学生程序设计竞赛 - 五月赛A,B,C
A. 选择 多造几组数据可以发现 \(dp[n] = dp[n / 2] + 1\). 假如一个序列为\(\{1,2,\cdots,n\}\),那我们从\(n/2\)后都减去\(n/2\),序列就 ...
- quartz执行卡死--强制中断线程
在quartz中经常会碰到由于网络问题或者一些其他不稳定因素导致的线程卡死问题,这往往会导致数据处理的延时.而有时候一时无法定位到卡死的原因,为了降低系统风险,我们就会希望有一个超时机制,当执行超时时 ...