Research
Security News
Malicious npm Packages Inject SSH Backdoors via Typosquatted Libraries
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.
natty-storage
Advanced tools
Storage plus for javascript!
🍻 开发者的体验至关重要!
natty
系列的小工具,在微小的技术点上追求极致的开发体验。如果对你有帮助,请Star
支持一下,感谢 :D
🍟
natty-fetch
中创建灵活的多层级接口的实现,就是借助natty-storage
实现的。
localStorage
和sessionStorage
,还可以是内存对象variable
。path
)方式,而且内部自动补全不存在的路径,大大减少了代码量。get('a.b.c')
时,a
对象不存在b
键,不会报错,返回undefined
。plain object
对象,取值也可以直接得到plain object
,相对于原生的(local|session)Storage.(set|get)Item
方法(赋值需要JSON.stringify
,取值需要JSON.parse
),大大减少了代码量。type:localStorage
时,和直接使用浏览器原生localStorage
相比,natty-storage
在性能上做了很多改进。
set
和remove
方法,才真正调用了原生localStorage
对象。get
和has
方法,根本没有调用。set
和remove
方法只调用一次原生localStorage
对象。如果直接使用浏览器原生localStorage
对象,则是两次(先从localStorage
中取出数据,然后修改数据,最后再存入localStorage
)。set/asyncSet
、get/asyncGet
、has/asyncHas
、remove/asyncRemove
和destroy/asyncDestroy
。tag
)、有效期长(duration
)、有效期至(until
),不再重复编码。localStorage
和sessionStorage
,此时自动降级为variable
模式。gzip
后的只有2.5K
。npm install natty-storage --save
创建缓存对象
参数 options {Object}
localStorage
、sessionStorage
和variable
。默认为variable
。注意:当指定type
的值为localStorage/sessionStorage
,但浏览器的localStorage/sessionStorage
不可用时(比如Safari
浏览器的隐身模式),会自动降级到varable
方式存储。key
值相同,则缓存的数据也是相同的。tag
不同则缓存失效。通常tag
值是一个字符串标识,比如版本号。until
{Number} 可选。值为13位长度的时间戳。用于验证数据有效性的标识(之三)。通过"有效期至"来判断缓存对象所存储的数据是否有效。过期则缓存失效。示例
const storage = nattyStorage({
type: 'localStorage', // 缓存方式, 默认为'localStorage'
key: 'ChinaCity', // !!! 唯一必选的参数, 用于内部存储 !!!
tag: 'v1.0', // 缓存的标记, 用于判断是否有效
duration: 1000*60*10, // 缓存的有效期长, 以毫秒数指定
until: 1464759086797 // 缓存的到期时间, 以具体日期时间的时间戳指定
})
把指定的plain object
对象设置为缓存对象的值。
注意:
storage.data
方法是整体设置缓存数据,而下面的storage.set
方法是以键或路径的方式设置数据,要根据具体场景来选择合适的方法。
参数
示例
storage.data({'foo': 'x'}})
storage.get('foo') // => 'x'
storage.get() // => {"foo":"x"}
以键或路径的方式在缓存对象上存储数据,没有返回值。
参数
.
分割。示例
storage.set('foo', 'x')
storage.set('boo.y', 'y')
获取缓存对象上存储的数据。返回指定路径下对应的值。
参数
.
分割。示例
const storage = nattyStorage({
key: 'test',
type: 'localStorage'
})
// 获取存在的值
storage.set('foo', 'x')
storage.get('foo') // => 'x'
// 获取不存在的值
storage.get('boo') // => undefined
storage.get('boo', 'x') // => 'x'
storage.get('foo.boo') // => undefined
// 值为0
storage.set('zero', 0)
storage.get('zero', 'x') // => 0
作用同storage.get
,区别在于如果取到的值是undefined
,会抛错。而且该方法不支持fallbackValue
参数。应用于必须设置值的场景(如:项目的配置文件中,必须指定数据接口URL
地址),在项目的开发过程中就及时反馈丢失的配置。
参数
.
分割。示例
// 如果'server.apiPrefix'值没有配置,则调用sure会看见:
// Unexpected undefined value returned by path 'server.apiPrefix'
storage.sure('server.apiPrefix')
判断指定路径的数据在缓存对象中是否存在。
参数
返回 {Object},包括两个属性
value
为对应的值。否则为undefined
。示例
const storage = nattyStorage({
key: 'test',
type: 'localStorage'
})
storage.set('foo', 'x')
storage.has('foo') // => {has: true, value: 'x'}
storage.has('boo') // => {has: false, value: undefined}
从缓存对象中删除指定路径的数据,包括键和值,没有返回值。
参数
示例
// 参数为键
storage.remove('foo')
// 参数为路径
storage.remove('foo.bar')
// 不传参数,删除所有数据
storage.remove()
销毁缓存对象,销毁后不能再调用任何方法,没有返回值。
示例
storage.destroy()
上面的set
、get
、has
、remove
、destroy
方法都是同步的,同时还有一一对应的一套异步方法,asyncSet
、asyncSet
、asyncHas
、asyncRemove
、asyncDestroy
,这些异步方法返回一个标准的Promise
对象。
ls.asyncSet('foo', 'x').then(() => {
ls.asyncGet().then(data => {
// data 值为 {"foo":"x"}
})
})
在控制台输出当前缓存对象的所有数据,没有返回值。
示例
storage.set('foo', 'x')
storage.dump()
// 控制台输入如下结果
// {
// "foo": "x"
// }
清理掉因为until
和duration
的有效期而过期的数据。在natty-storage
加载后,内部会自动执行一次。
示例
nattyStorage.clean()
在浏览器控制台打印出所有由natty-storage
创建的缓存数据。三个类别的缓存都会被打印。该方法通常仅用于调试。
示例
nattyStorage.list()
遍历由natty-storage
创建的所有缓存对象,回调函数接受一个参数,即storage
对象。上面的clean
和list
方法,内部就是调用该方法实现的。
示例
// `nattyStorage.list`方法的内部实现
nattyStorage.list = function () {
this.each(function (storage) {
hasConsole && console.log(storage.config.type, storage.config.key, storage.get())
})
}
创建一个env
对象,该对象也可以直接作为节点的值。
env
对象的特点:
env
对象一旦创建,它对应的值(就是创建时env
对应的值)就不可再更改。env
对象取值的唯一方式是调用get
方法。env
在nattyStorage
不能再添加子节点。参数
示例:
// 这个`demo`应用在`node`层,`type`设置为`variable`
const storage = nattyStorage({
key: 'demo',
type: 'variable'
})
// 设置`server`端的统一`api`前缀
storage.set('apiPrefix', nattyStorage.env(process.env.NODE_ENV, {
development: 'http://0.0.0.0/api',
production: 'http://foo.com/api',
}))
// 如果`process.env.NODE_ENV`为`production`
storage.get('apiPrefix') // => 'http://foo.com/api'
// 给`apiPrefix`再添加子节点是不允许的,下面一句将报错。
storage.set('apiPrefix.foo', 'hello')
nattyStorage
依赖现代浏览器的两个对象。在非现代浏览器下,可以通过引入polyfill
解决。
如果需要兼容IE8
和IE9
,需要引入es5-shim
和es5-sham
。
安装
npm install es5-shim --save
将下面的代码添加到nattyStorage
标签之前
<!--[if lt IE 10]>
<script type="text/javascript" src="./node_modules/es5-shim/es5-shim.min.js"></script>
<script type="text/javascript" src="./node_modules/es5-shim/es5-sham.min.js"></script>
<![endif]-->
把代码clone
到本地,在根目录下执行:
npm install
npm start
npm run build
FAQs
Unknown package
We found that natty-storage demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 2 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.
Security News
MITRE's 2024 CWE Top 25 highlights critical software vulnerabilities like XSS, SQL Injection, and CSRF, reflecting shifts due to a refined ranking methodology.
Security News
In this segment of the Risky Business podcast, Feross Aboukhadijeh and Patrick Gray discuss the challenges of tracking malware discovered in open source softare.