babel 基础
babel-core
是作为babel的核心存在,负责转义ast,
import {tranform, transformFile, transformFileSync, transformFromAst } from ‘babel-core’
babel-cli
babel-cli是一个通过命令行对js文件进行换码的工具。
babel script.js
babel-node
这是一个支持ES6的js执行环境。
babel-register
底层改写了node的require方法,引入babel-register之后所有require并以.es6, .es, .jsx 和 .js为后缀的模块都会经过babel的转译。
1 | //test.js |
babel-polyfill
polyfill在代码中的作用主要是用已经存在的语法和api实现一些浏览器还没有实现的api,对浏览器的一些缺陷做一些修补。例如Array新增了includes方法,箭头函数、解构赋值、class、Promise
.babelrc babel run command缩写
官方唯一推荐preset:babel-preset-env。
webpack 大致运行流程
- 获取配置参数 webpack.config.js
- 实例化Compiler, 通过run方法开启编译 //Compiler类,
- 根据入口文件, 创建依赖项, 并递归获取所有模块的依赖模块 //
- 通过loader去解析匹配到的模块
- 获取模板, 把解析好的数据套进不同的模板 // 切割模块儿模板,
- 输出文件到指定路径
如何编写一个Loader
1 | // stylus-loader |
如何写一个webpack插件
1、一个 js 命名函数。
2、在原型链上存在一个 apply 方法。
3、为该插件指定一个 Webpack 的事件钩子函数。
4、使用 Webpack 内部的实例对象(Compiler 或者 Compilation)具有的属性或者方法。
5、当功能完成以后,需要执行 Webpack 的回调函数。1
2
3
4
5
6
7
8function myExampleWebpackPlugin( ){ }
myExampleWebpackPlugin.prototype.apply = function(Compiler){
Compiler.plugin(‘compilation’,function(compilation,callback){
console.log(‘this is an example plugin’);
callback( );
})
}
`
Compiler 对象: Compiler 对象代表了 Webpack 完整的可配置的环境。
该对象在 Webpack 启动的时候会被创建,同时该对象也会被传入一些可控的配置,如 Options、Loaders、Plugins。
当插件被实例化的时候,会收到一个 Compiler 对象,通过这个对象可以访问 Webpack 的内部环境。
Compilation 对象: Compilation 对象在每次文件变化的时候都会被创建,因此会重新产生新的打包资源。
该对象表示本次打包的模块、编译的资源、文件改变和监听的依赖文件的状态。
如何手写一个简单的webpack
clean-webpack-plugin
1 | const CleanWebpackPlugin = require('clean-webpack-plugin’); 不必每一次都有手动清除dist,自动清除。 |
extract-text-webpack-plugin
该插件的主要是为了抽离css样式,防止将样式打包在js中引起页面样式加载错乱的现象。
glob-all , glob
在webpack中的使用。
link
读取某个文件夹下所有的文件。
1 | glob("./src/components/**/*.js", function (er, files) { |
webpack3-webpack4升级
从webpack4开始官方移除了commonchunk插件,改用了optimization属性进行更加灵活的配置,这也应该是从V3升级到V4的代码修改过程中最为复杂的一部分,
下面的代码即是optimize.splitChunks 中的一些配置参考
1 | module.exports = { |
chunks的取值是有initial, async, all。默认情况下是async,
initial , all 模式会将所有来自node_modules的模块分配到一个叫vendors的缓存组;所有重复引用至少两次的代码,会被分配到default的缓存组。
https://www.codercto.com/a/26564.html 关于配置splitChunk的一些介绍,不是很懂。
babel-polyfill和babel-runtime区别
babel-polyfill会有一定副作用,比如:
引入了新的全局对象:比如Promise、WeakMap等。
修改现有的全局对象:比如修改了Array、String的原型链等。
举个例子,我在项目中定义了跟规范不一致的Array.from()函数,同时引入了一个库(依赖babel-polyfill),
此时,这个库可能覆盖了自定义的Array.from()函数,导致出错。
babel-runtime存在的原因。它将开发者依赖的全局内置对象等,抽取成单独的模块,并通过模块导入的方式引入,避免了对全局作用域的修改(污染)。
因此,如果是开发库、工具,可以考虑使用 babel-runtime。
babel-plugin-transform-runtime和 babel-runtime 区别
babel-plugin-transform-runtime
用于构建过程的代码转换,babel-runtime是实际导入项目代码的功能模块。
1 | var promise = new Promise; -> `npm bin`/babel index.js |
babelrc 详解
babel 用法及其 .babelrc 的配置详解,想做前端架构,拒绝一知半解
如何写好.babelrc?Babel的presets和plugins配置解析
1 | es2015(es6集合 ) |
webpack处理css文件
css-loader css-loader 中 importLoaders 选项的作用是,用于配置 css-loader 作用于 @import 的资源之前需要经过其他 loader 的个数。@ import 用于 css 源码中引用 其他模块的关键字,如果你的项目中确定不会涉及模块化,可以忽略此配置项。
style-loader 如果需要将编译后的 css文件独立导出,则须将 style-loader 替换为 extract-text-webpack-plugin,1
2
3
4
5
6
7npm install css-loader style-loader --save-dev
rules: [
{
test: /\.css$/,
use: ['style-loader', 'css-loader']
},
]
webpack处理图片文件
1 | npm install url-loader --save-dev // 处理图片文件 |
实现Npm run dev
1 | npm install webpack-dev-server -D // |