先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Web前端全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024c (备注前端)
正文
]
插件开发
我们自己也可以开发插件,官网上的一个非常简单的小例子:
export default function() {
return {
visitor: {
Identifier(path) {
const name = path.node.name;
// reverse the name: JavaScript -> tpircSavaJ
path.node.name = name
.split(“”)
.reverse()
.join(“”);
},
},
};
}
preset
,意为“预设”,其实是一组plugin
的集合。我的理解是,根据这项配置,babel
会为你预设(或称为“内置”)好一些ECMA
标准,草案,或提案下的语法或API
,甚至是你自己写的一些语法规则。当然,这都是基于plugin
实现的。
官方presets
@babel/preset-env
@babel/preset-env
提供了一种智能的预设,根据配置的options
来决定支持哪些能力。
我们看看关键的options
有哪些。
- targets
描述你的项目要支持的目标环境。写法源于开源项目browserslist。这项配置应该根据你需要兼容的浏览器而设置,不必与其他人一模一样。示例如下:
“targets”: {
“browsers”: [“> 1%”, “last 2 versions”, “not ie <= 9”]
}
- loose
可以直译为“松散模式”,默认为false
,即为normal
模式。简单地说,就是normal
模式转换出来的代码更贴合ES6
风格,更严谨;而loose
模式更像我们平时的写法。以class
写法举例:
我们先写个简单的class
:
class TestBabelLoose {
constractor(name) {
this.name = name
}
getName() {
return this.name
}
}
new TestBabelLoose(‘Tusi’)
使用normal
模式编译得到结果如下:
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(“Cannot call a class as a function”); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (“value” in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
var TestBabelLoose =
/#PURE/
function () {
function TestBabelLoose() {
_classCallCheck(this, TestBabelLoose);
}
_createClass(TestBabelLoose, [{
key: “constractor”,
value: function constractor(name) {
this.name = name;
}
}, {
key: “getName”,
value: function getName() {
return this.name;
}
}]);
return TestBabelLoose;
}();
new TestBabelLoose(‘Tusi’);
而使用loose
模式编译得到结果是这样的,是不是更符合我们用prototype
实现类的写法?
“use strict”;
var TestBabelLoose =
/#PURE/
function () {
function TestBabelLoose() {}
var _proto = TestBabelLoose.prototype;
_proto.constractor = function constractor(name) {
this.name = name;
};
_proto.getName = function getName() {
return this.name;
};
return TestBabelLoose;
}();
new TestBabelLoose(‘Tusi’);
个人推荐配置loose: false
,当然也要结合项目实际去考量哪种模式更合适。
- modules
可选值有:"amd" | "umd" | "systemjs" | "commonjs" | "cjs" | "auto" | false
,默认是auto
该配置将决定是否把ES6
模块语法转换为其他模块类型。注意,cjs
是commonjs
的别名。
其实我一直有个疑惑,为什么我看到的开源组件中,基本都是设置的modules: false
?后面终于明白了,原来这样做的目的是把转换模块类型的处理权交给了webpack
,由webpack
去处理这项任务。所以,如果你也使用webpack
,那么设置modules: false
就没错啦。
- useBuiltIns
可选值有:"entry" | "usage" | false
,默认是false
该配置将决定@babel/preset-env
如何去处理polyfill
"entry"
如果useBuiltIns
设置为"entry"
,我们需要安装@babel/polyfill
,并且在入口文件引入@babel/polyfill
,最终会被转换为core-js
模块和regenerator-runtime/runtime
。对了,@babel/polyfill
也不会处理stage <=3
的提案。
我们用一段包含了Promise
的代码来做下测试:
import “@babel/polyfill”;
class TestBabelLoose {
constractor(name) {
this.name = name
}
getName() {
return this.name
}
testPromise() {
return new Promise(resolve => {
resolve()
})
}
}
new TestBabelLoose(‘Tusi’)
但是编译后,貌似引入了很多polyfill
啊,一共149个,怎么不是按需引入呢?嗯…你需要往下看了。
import “core-js/modules/es6.array.map”;
import “core-js/modules/es6.map”;
import “core-js/modules/es6.promise”;
import “core-js/modules/es7.promise.finally”;
import “regenerator-runtime/runtime”;
// 此处省略了144个包。。。
"usage"
如果useBuiltIns
设置为"usage"
,我们无需安装@babel/polyfill
,babel
会根据你实际用到的语法特性导入相应的polyfill
,有点按需加载的意思。
// 上个例子中,如果改用useBuiltIns: ‘usage’,最终转换的结果,只有四个模块
import “core-js/modules/es6.object.define-property”;
import “core-js/modules/es6.promise”;
import “core-js/modules/es6.object.to-string”;
import “core-js/modules/es6.function.name”;
配置"usage"
时,常搭配corejs
选项来指定core-js
主版本号
useBuiltIns: “usage”,
corejs: 3
false
如果useBuiltIns
设置为false
,babel
不会自动为每个文件加上polyfill
,也不会把import "@babel/polyfill"
转为一个个独立的core-js
模块。
@babel/preset-env
还有一些配置,自己慢慢去折腾吧…
stage-x
stage-x
描述的是ECMA
标准相关的内容。根据TC39
(ECMA
39号技术专家委员会)的提案划分界限,stage-x
大致分为以下几个阶段:
-
stage-0:
strawman
,还只是一种设想,只能由TC39
成员或者TC39
贡献者提出。 -
stage-1:
proposal
,提案阶段,比较正式的提议,只能由TC39
成员发起,这个提案要解决的问题须有正式的书面描述,一般会提出一些案例,以及API
,语法,算法的雏形。 -
stage-2:
draft
,草案,有了初始规范,必须对功能的语法和语义进行正式描述,包括一些实验性的实现,也可以提出一些待办事项。 -
stage-3:
condidate
,候选,该提议基本已经实现,需要等待实践验证,用户反馈及验收测试通过。 -
stage-4:
finished
,已完成,必须通过Test262
验收测试,下一步就是纳入到ECMA
标准中。比如一些ES2016
,ES2017
的语法就是通过这个阶段被合入ECMA
标准中了。
有兴趣了解的可以关注ecma262。
需要注意的是,babel@7已经移除了stage-x的preset,stage-4部分的功能已经被@babel/preset-env集成了,而如果你需要stage <= 3部分的功能,则需要自行通过plugins组装。
As of v7.0.0-beta.55, we’ve removed Babel’s Stage presets.
Please consider reading our blog post on this decision at
https://babeljs.io/blog/2018/07/27/removing-babels-stage-presets
for more details. TL;DR is that it’s more beneficial in the long run to explicitly add which proposals to use.
If you want the same configuration as before:
{
“plugins”: [
// Stage 2
[“@babel/plugin-proposal-decorators”, { “legacy”: true }],
“@babel/plugin-proposal-function-sent”,
“@babel/plugin-proposal-export-namespace-from”,
“@babel/plugin-proposal-numeric-separator”,
“@babel/plugin-proposal-throw-expressions”,
// Stage 3
“@babel/plugin-syntax-dynamic-import”,
“@babel/plugin-syntax-import-meta”,
[“@babel/plugin-proposal-class-properties”, { “loose”: false }],
“@babel/plugin-proposal-json-strings”
]
}
自己写preset
如需创建一个自己的preset
,只需导出一份配置即可,主要是通过写plugins
来实现preset
。此外,我们也可以在自己的preset
中包含第三方的preset
。
module.exports = function() {
return {
// 增加presets项去包含别人的preset
最后
==
就答题情况而言,第一问100%都可以回答正确,第二问大概只有50%正确率,第三问能回答正确的就不多了,第四问再正确就非常非常少了。其实此题并没有太多刁钻匪夷所思的用法,都是一些可能会遇到的场景,而大多数人但凡有1年到2年的工作经验都应该完全正确才对。
只能说有一些人太急躁太轻视了,希望大家通过此文了解js一些特性。
并祝愿大家在新的一年找工作面试中胆大心细,发挥出最好的水平,找到一份理想的工作。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
`。
module.exports = function() {
return {
// 增加presets项去包含别人的preset
最后
==
就答题情况而言,第一问100%都可以回答正确,第二问大概只有50%正确率,第三问能回答正确的就不多了,第四问再正确就非常非常少了。其实此题并没有太多刁钻匪夷所思的用法,都是一些可能会遇到的场景,而大多数人但凡有1年到2年的工作经验都应该完全正确才对。
只能说有一些人太急躁太轻视了,希望大家通过此文了解js一些特性。
并祝愿大家在新的一年找工作面试中胆大心细,发挥出最好的水平,找到一份理想的工作。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-ZfU5o9X8-1713465078319)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!