详解用Webpack与Babel配置ES6开发环境


Posted in Javascript onMarch 12, 2019

安装 Webpack

安装:

# 本地安装
$ npm install --save-dev webpack webpack-cli

# 全局安装
$ npm install -g webpack webpack-cli

在项目根目录下新建一个配置文件—— webpack.config.js 文件:

const path = require('path');

module.exports = {
 mode: 'none',
 entry: './src/index.js',
 output: {
  filename: 'bundle.js',
  path: path.resolve(__dirname, 'dist')
 }
}

在 src 目录下新建 a.js 文件:

export const isNull = val => val === null
export const unique = arr => [...new Set(arr)]

在 src 目录下新建 index.js 文件:

import { isNull, unique } from './a.js'
const arr = [1, 1, 2, 3]
console.log(unique(arr))
console.log(isNull(arr))

执行编译打包命令,完成后打开 bundle.js 文件发现 isNull 和 unique 两个函数没有被编译,和 webpack 官方说法一致:webpack 默认支持 ES6 模块语法,要编译 ES6 代码依然需要 babel 编译器。

安装配置 Babel 编译器

使用 Babel 必须先安装 @babel/core 和 @babel/preset-env 两个模块,其中 @babel/core 是 Babel 的核心存在,Babel 的核心 api 都在这个模块里面,比如:transform。而 @babel/preset-env 是一个智能预设,允许您使用最新的 JavaScript,而无需微观管理您的目标环境需要哪些语法转换(以及可选的浏览器polyfill)。因为这里使用的打包工具是 Webpack,所以还需要安装 babel-loader 插件。

安装:

$ npm install --save-dev @babel/core @babel/preset-env babel-loader

新建 .babelrc 文件:

{
 "presets": [
  "@babel/preset-env"
 ]
}

修改 webpack 配置文件(webpack.config.js):

const path = require('path');

module.exports = {
 mode: 'none',
 entry: './src/index.js',
 output: {
  filename: 'bundle.js',
  path: path.resolve(__dirname, 'dist')
 },
 module: {
  rules: [
   {
    test: /\.js$/,
     loader: 'babel-loader',
     exclude: /node_modules/
   }
  ]
 }
}

由于 babel 默认只转换 ES6 新语法,不转换新的 API,如:Set、Map、Promise等,所以需要安装 @babel/polyfill 转换新 API。安装 @babel/plugin-transform-runtime 优化代码,@babel/plugin-transform-runtime 是一个可以重复使用 Babel 注入的帮助程序代码来节省代码的插件。

安装 @babel/polyfill、@babel/plugin-transform-runtime 两个插件:

$ npm install --save-dev @babel/polyfill @babel/plugin-transform-runtime

修改 .babelrc 配置文件:

{
 "presets": [
  ["@babel/preset-env", {
   "useBuiltIns": "usage", // 在每个文件中使用polyfill时,为polyfill添加特定导入。利用捆绑器只加载一次相同的polyfill。
   "modules": false // 启用将ES6模块语法转换为其他模块类型,设置为false不会转换模块。
  }]
 ],
 "plugins": [
  ["@babel/plugin-transform-runtime", {
   "helpers": false
  }]
 ]
}

最后,配置兼容的浏览器环境。在 .babelrc 配置文件中设置 targets 属性:

{
 "presets": [
  ["@babel/preset-env", {
   "useBuiltIns": "usage",
   "modules": false,
   "targets": {
    "browsers": "last 2 versions, not ie <= 9"
   }
  }]
 ],
 "plugins": [
  ["@babel/plugin-transform-runtime", {
   "helpers": false
  }]
 ]
}

执行命令编译代码,完成后检查 bundle.js 文件,是否成功转换新 API 。如果发现以下代码即说明转换成功:

// 23.2 Set Objects
module.exports = __webpack_require__(80)(SET, function (get) {
 return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };
}, {
 // 23.2.3.1 Set.prototype.add(value)
 add: function add(value) {
  return strong.def(validate(this, SET), value = value === 0 ? 0 : value, value);
 }
}, strong);

其他关于 js 压缩和 Webpack 启用 tree shaking 功能的设置本文不在赘述。

配置文件详情概览

package.json 文件:

{
 "name": "demo",
 "version": "1.0.0",
 "description": "",
 "main": "index.js",
 "scripts": {
  "test": "echo \"Error: no test specified\" && exit 1",
  "dev": "webpack"
 },
 "keywords": [],
 "author": "",
 "license": "ISC",
 "devDependencies": {
  "@babel/core": "^7.3.4",
  "@babel/plugin-transform-runtime": "^7.3.4",
  "@babel/polyfill": "^7.2.5",
  "@babel/preset-env": "^7.3.4",
  "babel-loader": "^8.0.5",
  "webpack": "^4.29.6",
  "webpack-cli": "^3.2.3"
 }
}

webpack.config.js 文件:

const path = require('path');

module.exports = {
 mode: 'none',
 entry: './src/index.js',
 output: {
  filename: 'bundle.js',
  path: path.resolve(__dirname, 'dist')
 },
 module: {
  rules: [
   {
    test: /\.js$/,
     loader: 'babel-loader',
     exclude: /node_modules/
   }
  ]
 }
}

.babelrc 文件:

{
 "presets": [
  ["@babel/preset-env", {
   "useBuiltIns": "usage",
   "modules": false,
   "targets": {
    "browsers": "last 2 versions, not ie <= 9"
   }
  }]
 ],
 "plugins": [
  ["@babel/plugin-transform-runtime", {
   "helpers": false
  }]
 ]
}

符录

usuallyjs 项目是本人最近建设的开源项目,欢迎感兴趣的同行交流。

usuallyjs: https://github.com/JofunLiang/usuallyjs

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JQuery 确定css方框模型(盒模型Box Model)
Jan 22 Javascript
javascript + jquery实现定时修改文章标题
Mar 19 Javascript
让javascript加载速度倍增的方法(解决JS加载速度慢的问题)
Dec 12 Javascript
js光标定位文本框回车表单提交问题的解决方法
May 11 Javascript
JavaScript数组方法大全(推荐)
Jul 05 Javascript
基于javascript实现的快速排序
Dec 02 Javascript
swiper动态改变滑动内容的实现方法
Jan 17 Javascript
理解 JavaScript EventEmitter
Mar 29 Javascript
解决vue脚手架项目打包后路由视图不显示的问题
Sep 20 Javascript
Vue监听页面刷新和关闭功能
Jun 20 Javascript
微信小程序 网络通信实现详解
Jul 23 Javascript
微信小程序返回上一页传参并刷新过程解析
Dec 13 Javascript
详解微信小程序框架wepy踩坑记录(与vue对比)
Mar 12 #Javascript
javascript中数组的常用算法深入分析
Mar 12 #Javascript
详解javascript 变量提升(Hoisting)
Mar 12 #Javascript
NestJs 静态目录配置详解
Mar 12 #Javascript
JavaScript使用小插件实现倒计时的方法讲解
Mar 11 #Javascript
30分钟精通React今年最劲爆的新特性——React Hooks
Mar 11 #Javascript
记录一次完整的react hooks实践
Mar 11 #Javascript
You might like
thinkphp的静态缓存用法分析
2014/11/29 PHP
PHP通过文件保存和更新信息的方法分析
2019/09/12 PHP
JS 常用校验函数
2009/03/26 Javascript
Jquery 基础学习笔记
2009/05/29 Javascript
JQuery扩展插件Validate 5添加自定义验证方法
2011/09/05 Javascript
instanceof和typeof运算符的区别详解
2014/01/06 Javascript
jquery 表格排序、实时搜索表格内容(附图)
2014/05/19 Javascript
浅析Javascript ES6新增值比较函数Object.is
2016/08/24 Javascript
JS实现探测网站链接的方法【测试可用】
2016/11/08 Javascript
微信小程序通过api接口将json数据展现到小程序示例
2017/01/20 Javascript
input获取焦点时底部菜单被顶上来问题的解决办法
2017/01/24 Javascript
JavaScript该如何学习 怎样轻松学习JavaScript
2017/06/12 Javascript
JavaScript实现职责链模式概述
2018/01/25 Javascript
深入理解JavaScript和TypeScript中的class
2018/04/22 Javascript
vue中实现回车键登录功能
2020/02/19 Javascript
利用Python如何生成随机密码
2016/04/20 Python
python 捕获shell脚本的输出结果实例
2017/01/04 Python
Python常用时间操作总结【取得当前时间、时间函数、应用等】
2017/05/11 Python
python 匹配url中是否存在IP地址的方法
2018/06/04 Python
python3读取excel文件只提取某些行某些列的值方法
2018/07/10 Python
解决python3读取Python2存储的pickle文件问题
2018/10/25 Python
python登录WeChat 实现自动回复实例详解
2019/05/28 Python
django框架使用方法详解
2019/07/18 Python
Python线上环境使用日志的及配置文件
2019/07/28 Python
Pytorch Tensor 输出为txt和mat格式方式
2020/01/03 Python
python+tifffile之tiff文件读写方式
2020/01/13 Python
Django认证系统user对象实现过程解析
2020/03/02 Python
美国奢侈品购物平台:Orchard Mile
2018/05/02 全球购物
西班牙最大的婴儿用品网上商店:Bebitus
2019/05/30 全球购物
客服端调用EJB对象的几个基本步骤
2012/01/15 面试题
电子商务求职信
2014/06/15 职场文书
会计专业自荐书
2014/07/08 职场文书
商务邀请函
2015/01/30 职场文书
2015年社区计生工作总结
2015/04/21 职场文书
刑事附带民事诉讼答辩状
2015/05/22 职场文书
导游词之青城山景区
2019/09/27 职场文书