在前段时间,我把之前写的几个packag未经授权,禁止复制转载。【本文受版权保护】e重新命名为hello开头的包,例如he转载请注明出处:www.tangshuang.net【转载请注明来源】llo-storage, hello-e未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】vents, hello-worker,【原创内容,转载请注明出处】【转载请注明来源】这些包非常基础,不依赖任何第三方包,就是【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。用基础的api来实现的,因此,代码非常简【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】单。面对这种随即编写,随即打包发布的pa【本文受版权保护】【原创不易,请尊重版权】ckage,我采用最小化的方式进行发布。
本文作者:唐霜,转载请注明出处。【转载请注明来源】【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。一个包,在发布的时候,其实最重要的是考虑未经授权,禁止复制转载。【作者:唐霜】用户(开发者)使用这个包的使用场景,如果【原创内容,转载请注明出处】【转载请注明来源】不考虑,直接给源码就行了,干嘛还要进行构【本文受版权保护】转载请注明出处:www.tangshuang.net建发布呢?所以,对于我而言,主要考虑两点【作者:唐霜】【关注微信公众号:wwwtangshuangnet】:
本文版权归作者所有,未经授权不得转载。【作者:唐霜】【本文受版权保护】- 模块化【本文受版权保护】 本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】
- 代码兼容性【版权所有,侵权必究】 本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】
–本文版权归作者所有,未经授权不得转载。
本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】模块化是指用户可能在不同的模块规范下使用转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。你的包,目前而言,有amd, cmd, 转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。commonjs, es6 module【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】这几种,另外,还要考虑在浏览器中直接使用未经授权,禁止复制转载。【原创不易,请尊重版权】<script>标签引用脚本本文版权归作者所有,未经授权不得转载。【本文受版权保护】(没有模块化环境)。针对这点,我采用um【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。d的方案,但是代码是自己写的,我的源码是【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】es6 module,因此在导出的时候使【原创不易,请尊重版权】未经授权,禁止复制转载。用export default,但是在其他模块化规范下,并不需要def【版权所有】唐霜 www.tangshuang.net【转载请注明来源】ault这样的接口,因此要直接expor转载请注明出处:www.tangshuang.net【版权所有,侵权必究】t整个模块,因此,我的方案就是,对于要直【原创内容,转载请注明出处】【本文首发于唐霜的博客】接引用es6模块的用户,建议他impor【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。t源码文件,而其他模块化规范下,引用di【本文首发于唐霜的博客】【转载请注明来源】st文件:
// ES6
import HelloEvents from 'hello-events/src/hello-events'
// CommonJS
const HelloEvents = require('hello-events')
// 由于webpack在打包时能正确处理export default的问题,因此如果使用webpack,可以
import HelloEvents from 'hello-events'
对于开发者而言,这种解释应该是非常容易理【原创不易,请尊重版权】【原创不易,请尊重版权】解的。使用习惯上也不会造成困扰。那么怎么【本文首发于唐霜的博客】【转载请注明来源】来实现这套方案呢?我在代码中采用umd的原创内容,盗版必究。【本文受版权保护】方案实现:
【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】!function(root) {
// ES6代码转码之后放在这里
if (typeof define === 'function' && (define.cmd || define.amd)) { // amd | cmd
define(function(require, exports, module) {
module.exports = HelloEvents;
});
}
else if (typeof module !== 'undefined' && module.exports) {
module.exports = HelloEvents;
}
else {
root.HelloEvents = HelloEvents;
}
} (this || window);
这得益于我以前写过omd.js。那怎么才【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net能最终输出上面这个结构呢?我使用了gul【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】p来做,并用上了我写的gulp-buff【版权所有,侵权必究】【本文受版权保护】erify包来实现文件内容的修改。这样,著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net当我使用babel把es6的代码转化为e本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.nets5的代码之后,再对文件内容进行修改,就著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】能得到上面这个结构了。
【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。–【转载请注明来源】
【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】代码兼容性是指要考虑在不同浏览器版本中代著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。码都能跑,主要是指一些es6新特性的降级【版权所有】唐霜 www.tangshuang.net【转载请注明来源】,例如async函数。因为我写的这些pa著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】cakge的功能非常弱,不会涉及gene【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。rator函数,也不会涉及symbol,本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】因此其他大部分功能都可以用es5语法代替【转载请注明来源】本文作者:唐霜,转载请注明出处。,并且找到对应的babel插件即可。
【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。对于我而言,主要考虑到两个点:1.cla【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。ss语法;2.async/await语法【作者:唐霜】著作权归作者所有,禁止商业用途转载。;3. …语法。这三个语法已【原创不易,请尊重版权】【版权所有,侵权必究】经是我日常写作的必须品,因此在我的构建脚【本文受版权保护】【原创内容,转载请注明出处】本里面,首先需要将这三个语法转化为es5未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】语法。1和3使用babel-preset【关注微信公众号:wwwtangshuangnet】【作者:唐霜】-env就可以自动解决,非常好用,2的话【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net我使用了bebel-plugin-asy【原创内容,转载请注明出处】【版权所有,侵权必究】nc-to-promises,它可以将a【转载请注明来源】【原创内容,转载请注明出处】sync/await语法转换为promi【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】se,而preset-env默认使用be原创内容,盗版必究。本文作者:唐霜,转载请注明出处。bel-plugin-transform转载请注明出处:www.tangshuang.net【版权所有,侵权必究】-async-to-generator(【作者:唐霜】【版权所有,侵权必究】将async/await语法转换为gen【本文受版权保护】【原创内容,转载请注明出处】erator语法)和bebel-plug著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。in-transform-regener【转载请注明来源】【版权所有】唐霜 www.tangshuang.netator(使用一个特殊的变量regene【转载请注明来源】【作者:唐霜】ratorRuntime来支持gener【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】ator语法,这个变量需要你引入babe【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。l-polyfill),这两个插件和be本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】bel-plugin-async-to-【版权所有,侵权必究】【原创不易,请尊重版权】promises有冲突,因此要禁用默认选【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net项,在.babelrc里面这样写:
【版权所有,侵权必究】转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】未经授权,禁止复制转载。{
"presets": [
["env", { "exclude": ["transform-async-to-generator", "transform-regenerator"] }]
],
"plugins": [
"async-to-promises"
]
}
但是,其实这里对于开发者而言,是需要进行本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。权衡的,比如说,我会在代码中随意使用ar【作者:唐霜】【本文首发于唐霜的博客】ray.filter, Object.a【版权所有,侵权必究】转载请注明出处:www.tangshuang.netssign等,这些新接口是es6新加入的【转载请注明来源】转载请注明出处:www.tangshuang.net,对于老版本的浏览器是不支持的。但是这些本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。接口不会被babel转译,因此,我也不会【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】特意在自己的代码中去实现这一块。之所以不【版权所有,侵权必究】【原创内容,转载请注明出处】自己在代码中实现这块,是因为这种接口很大本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】程度上其他包也会用。对于使用包的开发者而【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】言,他需要自己进行权衡,是不是要引入一个【本文受版权保护】【未经授权禁止转载】polyfill,如果他自己不想支持低版本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net本的浏览器,就不用引入了。这样,可以保证转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。我自己的包里面的代码是绝对干净,但是在大【转载请注明来源】原创内容,盗版必究。部分情况下是可以运行的。
【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】原创内容,盗版必究。【原创不易,请尊重版权】但是这里有一个问题,就是为什么不把asy原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。nc/await也留给上层的开发者自己去【本文受版权保护】本文版权归作者所有,未经授权不得转载。决定。这是因为这个语法没有办法用poly【本文受版权保护】未经授权,禁止复制转载。fill,你不可能通过一个polyfil著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】l让一个不支持async语法的浏览器变得【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。支持。这就是权衡,如果我在自己的所有包里【未经授权禁止转载】【作者:唐霜】面都把这两个语法的转译代码写进去,那么最本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】后,上层开发者的应用里面,就会有重复代码著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】,这也是没有办法的,如果webpack等【本文首发于唐霜的博客】未经授权,禁止复制转载。打包工具更加智能,就可以将这些重复代码提转载请注明出处:www.tangshuang.net【版权所有,侵权必究】升作用域来实现减少重复的效果。
【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。–未经授权,禁止复制转载。
本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net【作者:唐霜】著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。上面讲完了我所关心的两个点之后,下面要出【转载请注明来源】未经授权,禁止复制转载。代码了。不过别急。我们再讨论一个问题,就本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net是有没有必要任何包都用webpack?答本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net案显而易见,我现在开始不大喜欢webpa本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.netck,我越来越觉得webpack应该是一本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。个应用层面进行打包时才用的上的工具,对于【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。一个package而言,不应该进行打包,本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】而是以原始的module文件间引用关系对本文版权归作者所有,未经授权不得转载。【作者:唐霜】外使用,只不过需要做上述两个点的处理。
原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net好了,上代码:【版权所有,侵权必究】
【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。// 安装对应的npm包 $ npm i -D babel-core babel-plugin-async-to-promises babel-preset-env gulp gulp-babel gulp-bufferify
// 构建脚本 build.js
var gulp = require('gulp')
var bufferify = require('gulp-bufferify').default
var babel = require('gulp-babel')
var namespace = 'HelloWorker' // 修改为自己的ClassName,一定要跟源码里面的class名对应
var entryfile = 'src/hello-worker.js' // 修改为自己的入口文件
gulp.src(entryfile)
.pipe(babel())
.pipe(bufferify(function(content) {
content = content.replace(/Object\.defineProperty\(exports,[\s\S]+?\);/gm, '')
content = content.replace(`exports.default = ${namespace};`, '')
content = `
!function(root) {
${content}
if (typeof define === 'function' && (define.cmd || define.amd)) { // amd | cmd
define(function(require, exports, module) {
module.exports = ${namespace};
});
}
else if (typeof module !== 'undefined' && module.exports) {
module.exports = ${namespace};
}
else {
root.${namespace} = ${namespace};
}
} (this || window);
`
content = content.trim()
content += "\n"
return content
}))
.pipe(gulp.dest('dist'))
// 进行构建 node build.js
这段构建脚本非常简单,稍微花点时间就读懂本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net了。根据自己的实际情况进行修改,比如路径转载请注明出处:www.tangshuang.net【版权所有,侵权必究】问题,比如namespace那个地方。总未经授权,禁止复制转载。未经授权,禁止复制转载。之对于我自己而言,非常简单的包都会采用这本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。样的模式去做。
著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】
