从模块化到认识Babel
转载自:https://www.cnblogs.com/qcloud1001/p/10167756.html
https://blog.csdn.net/a250758092/article/details/78543440
1.模块化
模块化是指把一个复杂的系统分解到一个一个的模块。
模块化开发的优点:
(1)代码复用,让我们更方便地进行代码管理、同时也便于后面代码的修改和维护。
(2)一个单独的文件就是一个模块,是一个单独的作用域,只向外暴露特定的变量和函数。这样可以避免污染全局变量,减少变量命名冲突。
js模块化规范有:CommonJS、AMD、CMD、ES6的模块系统。
1.1 CommonJS 规范
是服务器端模块的规范,由nodejs推广使用。该规范的核心思想是:允许模块通过require方法来同步加载所要依赖的其他模块,然后通过 exports 或 module.exports 来导出需要暴露的接口。
// 导出
module.exports = moduleA.someFunc;
// 导入
const moduleA = require('./moduleA');
1.2 AMD
AMD采用异步方式加载模块,模块的加载不影响它后面语句的运行。所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。由于不是JavaScript原生支持,使用AMD规范进行页面开发需要用到对应的库函数,也就是require.js(还有个js库:curl.js)
// 定义一个模块
define('module', ['dep'], function (dep) {
return exports;
}); // 导入和使用
require(['module'], function (module) {
});
1.3 ES6模块化
ES6在语言的层面上实现了模块化。浏览器厂商和 Node.js 都宣布要原生支持该规范。它将逐渐取代 CommonJS 和 AMD 规范,成为浏览器和服务器通用的模块解决方案。
在 ES6 中,使用export关键字来导出模块,使用import关键字引用模块。但是浏览器还没有完全兼容,需要使用babel转换成ES5。
// 导出
export function hello() { };
export default {
// ...
};
// 导入
import { readFile } from 'fs';
import React from 'react';
使用import导入模块时,需要知道要加载的变量名或函数名。
在ES6中还提供了export default,为模块指定默认输出。对应导入模块import时,不需要使用大括号。
2. Babel
在1.3中,我们提到了由于浏览器兼容问题,需要使用Babel将es6转成es5。官方给出的定义是,将 ECMAScript 2015+ 版本的代码转换为向后兼容的 JavaScript 语法,以便能够运行在当前和旧版本的浏览器或其他环境中。从中,我们可以看出,Babel的主要功能是“翻译”。
实际上babel转换后的代码是遵循commonJS规范的,而这个规范,浏览器(支持的是 ECMAScript)并不能识别。因此导入到浏览器中会报错,而nodeJS是commonJS的实现者,所以在babel转换后的代码是可以在node中运行的。
为了将babel生成的遵循commonJS规范的es5写法能够在浏览器上直接运行,我们就借助webpack这个打包工具来完成。【概括一下:流程是 es6->es5(commonJS规范)->浏览器可执行代码】
Babel中的Preset:即一组预先设定的插件(plugins)【嗯,所以它们之间是集合和元素的关系】可以使用官方提供的,也可以自己创建。通过babel.config.js文件中配置useBulidIns选项,可以只将我们需要的、目标浏览器中不支持的那些语法进行转义。
2.1 Babel配置文件的选择
之前版本的babel都是使用.baberc来做配置文件,babel7引入了babel.config.js。但是它并不是.baberc的替代品,二者根据使用的场景不同自行选择。
.babelrc
{
"presets": ["@babel/preset-flow","@babel/preset-react", "@babel/preset-typescript"],
"plugins": [...]
}
babel.config.js(新的) env的参数配置,https://babeljs.io/docs/en/babel-preset-env#options
module.exports = function () {
const presets = [
["env", {
"targets": { //指定要转译到哪个环境
//浏览器环境
"browsers": ["last 2 versions", "safari >= 7"],
//node环境
"node": "6.10", //"current" 使用当前版本的node
},
//是否将ES6的模块化语法转译成其他类型
//参数:"amd" | "umd" | "systemjs" | "commonjs" | false,默认为'commonjs'
"modules": 'commonjs',
//是否进行debug操作,会在控制台打印出所有插件中的log,已经插件的版本
"debug": false,
//强制开启某些模块(包含在该Preset中的),默认为[]
"include": ["transform-es2015-arrow-functions"],
//禁用某些模块,默认为[]
"exclude": ["transform-es2015-for-of"],
//babel / preset-env处理polyfill的方式。
//参数:usage | entry | false,默认为false.
"useBuiltIns": false
}]
];
// 不包含在Preset中的Plugins需要单独引入
const plugins = [ "@babel/transform-arrow-functions" ];
return {
presets,
plugins
};
}
useBuiltIns的三个参数都是什么意思呢?
entry:在应用程序入口导入一次core-js,多次导入可能会有全局冲突或其他问题。
usage:自动为每个文件添加特定的该文件所用到的polyfill。
false:不要为每个文件自动添加polyfill,也不将“@ babel / polyfill”导入到单个polyfill。
babel.config.js: 项目范围内的配置,放在根目录下。配置可用于node_modules文件夹。
.babelrc:文件通常用于根目录下有多个package的项目,放在packages目录下;或者放在packages的子目录下,但需要在babel.config.js文件中进行配置
babelrcRoots: [
".",
"packages/*",
],
2.2 需要安装的依赖
@babel/core:babel的核心包,核心的api都在这里。
@babel/cli :通过命令行运行babel.
- @babel/polyfill:包含所有新的JS语法特征。相当于一个填充,因为babel本身只支持转换箭头函数、结构赋值这些语法糖类的语法,而Polyfill中包含了Promise函数等新的特征。【注意】babel/polyfill安装时是--save而不是--save-dev
@babel/preset-env:指定的一组babel plugins.
当存在多个presets和多个plugins时的优先级:

2.3 如果想从es6一键转浏览器可以直接运行的es5, 可以利用webpack(详见参考链接2)
- 进入项目,并安装以下各个依赖
- npm install --save webpack
- npm install --save babel-loader
- npm install --save babel-core
- npm install --save babel-preset-es2015
自从babel升级6.x版本后就分成了两个插件,一个是babel-core【终端运行】(如果是node请安装babel-cli ),一个是babel-preset-es2015
安装完上述内容之后,需要设置一个.babelrc的文件放在根目录下,内容为
{
"presets": ["es2015"]
}
并且在webpack.config.js中配置babel-loader
module.exports = {
entry: "./js/main.js",
output:{
filename: 'bundle.js'
},
module: {
loaders: [{
test: /\.js$/,
loader: "babel-loader"
}]
}
}
配置完成后,就可以直接在JS文件中使用es6的语法,然后通过webpack命令打包生成,即可
从模块化到认识Babel的更多相关文章
- 07 . 前端工程化(ES6模块化和webpack打包)
模块化规范 传统开发模式主要问题 /* 1. 命名冲突 2. 文件依赖 */ 通过模块化解决上述问题 /* 模块化就是把单独的一个功能封装在一个模块(文件)中,模块之间相互隔离, 但是可以通过特定的接 ...
- ES6核心特性
摘要:聊JS离不开ES6啊! 原文:ES6核心特性 作者:ljianshu 前言 ES6 虽提供了许多新特性,但我们实际工作中用到频率较高并不多,根据二八法则,我们应该用百分之八十的精力和时间,好好专 ...
- web全栈架构师[笔记] — 01 ECMAScript6新特性
ES6新特性 一.变量 var:重复定义不报错:没有块级作用域:不能限制修改 let:变量,不能重复定义,有块级作用域 const:常量,不能重复定义,有块级作用域 二.函数/参数 箭头函数——简写: ...
- 前端面试题(一)JS篇
内置类型 JS 中分为七种内置类型,七种内置类型又分为两大类型:基本类型和对象(Object). 基本类型有六种: null,undefined,boolean,number,string,symbo ...
- H5新人福音~零配置搭建现代化的前端工程
X-BUILD一套基于Webpack(v4.21.0)快速搭建H5场景开发环境的脚手架,只需要几分钟的时间就可以运行起来.X-BUILD是针对H5开发的一套自动化构建工具,致力于提升开发效率,减小开发 ...
- 一、REACT概述
1.前端/react概述 <从零react> 1.前端工 程概述 Web跨平台.跨浏览 器的应用开发场景 网页浏览器(Web Browser) 通过 CLI 指令去操作的 Headless ...
- webpack、babel模块、模块化
一.webpack介绍 webpack这个工具非常强大,解决了前端很繁琐的一些工具流程繁琐的事情.中文官网链接地址:https://www.webpackjs.com/ 1.为什么要使用webpack ...
- 详解前端模块化工具-webpack
webpack是一个module bundler,抛开博大精深的汉字问题,我们暂且管他叫'模块管理工具'.随着js能做的事情越来越多,浏览器.服务器,js似乎无处不在,这时,使日渐增多的js代码变得合 ...
- 模块化管理工具兼打包工具 webpack
webpack 是一个[模块化管理工具]兼[打包工具] 是一个工具(和seajs,requirejs管理前端模块的方式是不一样) 在webpack一个文件就是一个模块! seajs,requirejs ...
随机推荐
- tcp的重传与超时
TCP协议是一种面向连接的可靠的传输层协议,它保证了数据的可靠传输,对于一些出错,超时丢包等问题TCP设计的超时与重传机制. 其基本原理:在发送一个数据之后,就开启一个定时器,若是在这个时间内没有收到 ...
- opencv-8-图像核与蒙板操作
opencv-8-图像核与蒙板操作 opencvc++qt 开始之前 在准备开始的时候, 我大概列了一个opencv 章节列表, 按照章节进行写, 写到某些部分的时候再具体调整章节内容, 完成了之后, ...
- 【JAVA基础】07 面向对象2
1. 代码块的概述和分类 面试的时候会问,开发不用或者很少用 代码块概述 在Java中,使用 {} 括起来的代码被称为代码块. 代码块分类 根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态 ...
- time wait 整理
目录 状态转换图 1.谁会进入time wait状态: 主动发起断开连接的一方调用close()函数发送FIN并进入FIN WAIT 1状态,当收到对面反馈的ack之后会进入FIN WAIT2状态.之 ...
- 再砸4.35亿美元,LG疯狂扩建太阳能电池生产线
LG在收缩高分辨率电视和其他消费电子产品业务的同时,在太阳能面板业务上却很明显一直在进行扩张.LG公司表示,他们将斥资4.35亿美元在韩国工厂增加超过6条生产线,使其太阳能电池生产量能够在2018年达 ...
- C#读写ini
using System; using System.IO; using System.Runtime.InteropServices; using System.Text; namespace ...
- HTML5学习笔记之表格标签
HTML5学习笔记之表格标签 其他HTML5相关文章 HTML5学习笔记之HTML5基本介绍 HTML5学习笔记之基础标签 HTML5学习笔记之表格标签 HTML5学习笔记之表单标签 HTML5学习笔 ...
- JAVA编程思想 Ch3.5题
练习5:创建一个class类,包含连两个String字段 :name.says.在main方法中创建两个Dog方法 一个命名为spot 叫声为 Ruff,另一个命民为scruffy,叫声为:Wuff: ...
- TensorRT入门
本文转载于:子棐之GPGPU 的 TensorRT系列入门篇 学习一下加深印象 Why TensorRT 训练对于深度学习来说是为了获得一个性能优异的模型,其主要的关注点在与模型的准确度.精度等指标. ...
- cookie、session 和 token 区别
1.什么是 cookie cookie 是保存在本地终端的数据.cookie 由服务器生成,发送给浏览器,浏览器把 cookie 以 kv 形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该 ...