初始ES6-Webpack
Posted Bk小凯笔记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初始ES6-Webpack相关的知识,希望对你有一定的参考价值。
ES6语法特性
变量和常量:let表示变量,const表示常量,let和const都是块级作用域;如一个函数内部、一个代码块内部{}
let的作用域是所在代码块,不会被提升到当前函数的顶部
const声明的变量必须提供一个值
字符串:
模板字符
1.用${},将表达式嵌入字符串中进行拼接。
//es5
console.log(‘hello‘+name)
//es6
console.log(‘hello ${name}‘)
2.ES5通过反斜杠来做多行或一行行字符串拼接,
ES6通过反引号‘‘直接搞定。
//es5
var msg = "wanglukai"
const template = ‘<div><span>wanglukai</span><div>‘
作用域:{}
函数:
默认参数
function action(num = 200){
console.log(num)
}
箭头函数
不需要function关键字来创建函数
省略return关键字
继承当前上下文的this关键字
语法:ES6:()=>{},ES5:function(){}
细节:
当函数仅有一个参数的时候,是可以省略掉括号的
当函数返回仅有一个表达式的时候,可以省略{}和return;
如:
//参数name没有括号
var people = name => ‘hello‘ + name
//参考
var people = (name,age) =>{
const fullName = ‘hello‘ + name
return fullName
}
键值对重名,
ES5简写:
function people(name,age){
return{
name:name,
age:age
}
}
const people = {
name:‘wang‘,
getName:function(){
console.log(this.name)
}
}
ES6简写:
function people(name,age){
return{
name,
age
}
}
const people = {
name:‘wang‘,
getName(){
console.log(this.name)
}
}
Object.assign()这个方法实现浅复制
解构-数据访问:
ES6新增了解构,这是将一个数据结构分解为更小部分的过程。
解构能让我们从对象或者数组里取出数据存为变量,
ES5提取对象信息如下:
const people = {//对象
name : ‘wang‘,
age : 24
}
const name = people.name
conse age = people.age
console.log(name+"---"+age)
ES6提取对象信息如下:
const people = {//对象
name : ‘wang‘
age : 24
}
const {name,age} = people
console.log("${name}---${age}")
const color = [‘red‘,‘blue‘]//数组
const [r,b] = color
console.log("${r}---${b}")
var [x,y]=getVal(),//函数返回值的解构
Spread Operator展开运算符
组装 对象或数组
const color = [‘wang‘,‘lu‘]//数组
const colorone [...color,‘kai‘]
console.log(colorone)
const wanglukai = {name : ‘王路凯‘,age : 24}
const wanglukaione = {...wanglukai,sex:‘男‘}
console.log(wanglukaione)
import和export
import导入模块,export导出模块
//全部导入
import people from ‘./example‘
//部分导入
import {name,age} from ‘./example‘
//默认导出,注只能有一个默认,但可以有多个export。
export default App
//部分导出
export class App extend Component{};
1.当用export default people导出时,就用 import people 导入(不带大括号)
2.一个文件里,有且只能有一个export default。但可以有多个export。
3.当用export name 时,就用import { name }导入(记得带上大括号)
4.当一个文件里,既有一个export default people, 又有多个export name 或者 export age时,导入就用 import people, { name, age }
5.当一个文件里出现n多个 export 导出很多模块,导入时除了一个一个导入,也可以用import * as example
Promise:用同步的方式去写异步代码(处理异步操作的一种模式)
//发起异步请求
fetch(‘/api/todos‘)
.then(res => res.json())
.then(data => ({data}))
.catch(err => ({err}));
var promise = new Promise(function (resolve,reject) {
//进行一些异步或耗时操作
if(/*如果成功*/){
resolve("Stuff worked!");
}else {
reject(Error(‘It broke‘));
}
})
//绑定处理程序
promise.then(function (result) {
//promise成功的话会执行这里
console.log(result);// "Stuff worked!"
},function (err) {
//promise失败会执行这里
console.log(err); // Error: "It broke"
})
Generators(生成器):是个能返回一个迭代器的函数,也是函数的一种
直观表现是比普通function多了个姓星号*,
函数体中可以使用yield关键字,会在每个yidld后暂停
//生成器
function *wang(){
yield 1;
yield 2;
yield 3;
}
//生成器能像函数那样被调用,但会返回一个迭代器
let iterator = wang();
console.log(iterator.next().value);
生成器可以让我们的代码进行等待。就不用嵌套的回调函数。
使用generator可以确保当异步调用在我们的generator函数运行一下行代码之前完成时暂停函数的执行。
咱们也不能手动一直调用next()方法,你需要一个能够调用生成器并启动迭代器的方法。
function run(taskDef){ //taskDef即一个生成器函数
let task = taskDef();//创建迭代器,让它在别处可用
let result = task.next();//启动任务
function step(){ //递归使用函数来保持对 next()的调用
if(!result.done){
result = task.next();
step();
}
}
step(); //开始处理过程
}
实际上却使用 yield 来等待异步操作结束。
----
static
state
class:ES6添加了对类的支持,
for of值遍历
for in 循环用于遍历数组,类数组或对象,
ES6中新引入的for of循环功能相似,不同的是每次循环它提供的不是序号而是值。
var Array = [a‘‘,‘b‘,‘c‘]
for( v of Array){
console.log(v) //输出a,b,c
}
Module 在ES6标准中,javascript原生支持module了。
//point.js
module "point"{
export class Point{
constructor(x,y){
public x =y
public y = y;
}
}
}
//myapp.js
//声明引用的模块
module point from "/point.js";
//尽管声明了引用的模块,还是可以通过指定需要的部分进行导入
import Point from "point";
var origin= new Point(0,0);
console.log(origin);
Map,Set和WeakMap,WeakSet
新加的集合类型,提供了更加方便的获取属性值的方法,
在进行属性值添加与获取时有专门的get,set 方法。
var vm = new WeakMap()
vm.set(s,{extra:42});
vm.add({data : 22})
vm.get(s) == 34;
vm.has == true;
vm.size == undefined
Proxies: Reflect-Proxy可以监听对象的行为,Reflect反射的作用
{
let obj = {
time:‘2017-03-11‘,
name:‘net‘,
_r:123
}
let monitor = new Proxy(obj, {
get(target, key) {
return target[key].replace(‘2017‘, ‘2017‘);
}
})
console.log(‘get‘,monitor.time)
}
Symbols:键通常来说是字符串,还可以用symbol这种值,作为对象的键。
声明的值不相等,保持唯一
新增API:
Numer.EPSILON
Number.isInteger(Infinity)//false
Number.isNaN("NaN")//false
Math.acosh(3)// 1.762747174039086
Math.hypot(3,4)//5
Math.imul(Math.pow(2,32) - 1,Math.pow(2,32) - 2)//2
"abcde".contains("") //true
"abc".repeat(3) //abcabcabc
Array.from(document.querySelectorAll(‘*‘)) // Returns a real Array
Array.of(1,2,3)// Similar to new Array(...), but without special one-arg behavior
[0,0,0].fill(7,1)// [0,7,7]
[1,2,3].findIndex(x => x ==2)// 1
[‘a‘,‘b‘,‘c‘].entries()// iterator [0, "a"], [1,"b"], [2,"c"]
[‘a‘,‘b‘,‘c‘].keys()// iterator 0, 1, 2
[‘a‘,‘b‘,‘c‘].values() // iterator "a", "b", "c"
Object.assign(Point,{origin:new Point(0,0)})
Decorator:修饰器(是函数、修改行为、修改类的行为)
{
let wang = (target,name,descriptor) =>{
descriptor.writable=false;
return descriptor
}
class Test{
@wang
time(){
return ‘2017-3-11‘
}
}
let test = new Test();
test.time = function () {
console.log(‘reset time‘)
}
console.log(test.time())
}
---------------Webpack---------------
Webpack是一个静态模块打包工具,根据依赖关系,将模块按照指定的规则生成对应的静态资源
打包:所有图片、所有样式、所有脚本、所有资源、所有静态文件
为何使用Webpack:
webpack有两种组织模块依赖的方式,同步和异步,异步依赖作为分割点 (将依赖书拆分成按需加载的块:)
webpack使用异步I/O和多级缓存提高运行效率, (初始化加载的耗时尽量少: )
通过loader转换器,把各种资源类型转换成JavaScript模块,供webpacke处理、(各种静态资源都可以视作模块:)
webpck有一个功能丰富的插件系统。 (自定义打包逻辑的能力:)
无论是单页还是多页的web应用
Vue Webpack Node npm cnpm的关系理解:
1.实际上Vue本身是不依赖Node的,
2.而Vue-cli的脚手架是依赖于Webpack的,所以间接的也需要Node的支持,
3.Webpack基于Node的运行环境,Webpack在执行打包压缩的时候依赖Node,
没有Node就不能使用Webpack,并且支持ES6
4.npm只是nodejs的一个模块,运行在Node上,全称(Node Package Manager)
5.cnpm是淘宝的、只为下载快点
6.node是一个运行在服务器端的js环境
entry入口
语法:const config = {
entry:{
app:‘./src/app.js‘, //注,app和vendors是自定义的
vendors:‘./src/vendors.js‘
}
}
output输出
语法:
const config = {
output:{
filename:‘bunlde.js‘, //filename:用于输出文件的文件名
path:‘/home/proj/public/assets‘ //目标输出目录 path 的绝对路径
}
}
module.exports = config; //引用
模式:告知webpack使用响应模式的内置优化
用法://分两种模式
module.exports = {
mode:‘production‘//模式1
mode:‘development‘//模式2
}
loader:用于模块的源代码进行转换为js认识的,使用时需安装相应的loader
module.exports = {
module:{
rules:[
{test:/.css$/,use:‘css-loader‘},
{test:/.ts$/,use:‘ts-loader‘}
]
}
}
{
module:{
rules:[
{
test:/.css$/,
use:[
{loader:‘style-loader‘},
{
loader:‘css-loader‘,
options:{
modules:true
}
}
]
}
]
}
}
常用Loader
编译相关:babel-loader、ts-loader
样式相关: style-loader、css-loader、less-loader、postcss-loader
文件相关: file-loader、url-loader
loader 也能够使用 options 对象进行配置。
Plugins插件:目的在于解决loader无法实现的事、可以参与整个打包过程、及其灵活
具有apply属性,且会被webpack compiler调用,
并且compiler对象可在整个编译生命周期访问。
例子:ConsoleLogOnBuildWebpackPlugin.js
const plugiName = ‘ConsoleLogOnBuildWebpackPlugin‘;
class ConsoleLogOnBuildWebpackPlugin{
apply(compiler){
compiler.hooks.run.tap(pluginName,compilation => {
console.log("webpack 构建过程开始");
});
}
}
常用Plugins
//提取代码 //混淆、压缩
优化相关:CommonsChunkPlugin、UglifyjsWebpackPlugin
//提取css、打包单独的 //生成html
功能相关:ExtractTextWebpackPlugin、HtmlWebpackPlugin、
//模块热更新 //帮助拷贝文件
HotModuleReplacementPlugin、CopyWebpackPlugin
config配置
因为webpack配置是Node CommonJS模块,所以可以做到如下:
1.通过require()导入其他文件
2.通过require()使用npm的工具函数
3.使用JS控制流表达式,如:?:
4.对常用值使用变量或常量
5.编写并执行函数来生成部分配置
基本配置
webpack.config.js
var path = require(‘path‘);
module.exports = {
mode:‘development‘,
entry:‘./foo.js‘,
output:{
filename:‘‘,
path:path.resolve(_dirname,‘dist‘)
}
}
modules模块
Node和webpack的模块依赖关系,如下;
ES5: import语句
CommonJS: require()语句
AMD: define 和 require
css/sass/less文件中的: @import
样式(url(...))或 HTML 文件(<img src=...>)中的图片链接(image url)
支持模块类型如下:
webpcak通过loader可以支持各种语言 和 预处理器编写模块,
1.CoffeeScript
2.TypeScript
3.ESNext(Babel)
4.Sass
5.Less
6.Stylus
搭建本地开发环境:分3中方式
webpack watch mode
webpack-dev-server的功能如下
live reloading
打包文件?No不能、webpack命令打包
路径重定向
https
浏览器中显示编译错误
接口代理
模块热更新
配置:
devServer
inline 默认为true
contentBase 指定内容路径
port 监听端口
historyApiFallback 指定页面规则
https 指定
proxy 远程接口代理
hot 打开模块热更新
openapge 指定最先打开的页面(初始页)
lazy 设置只有访问的资源,才会编译打包
overlay 错误提示、
proxy 和 http-proxy-middleware的参数一样,如下是参数
options
target 指定你代理的地址
changeOrigin设为true 改变 源 到url
headres 增加头信息
logLevel 帮助调试
pathRewrite 帮助重定向请求
express + webpck-dev-middleware
打包结果:
webpack --profile --json | Out-file ‘stats.json‘ - Encoding OEM //打包
http://webpack.github.io/aualyse //Webpcak官方分析工具
安装:
新建文件夹E:Webpack-probject,cmd进入该目录下 npm init初始化,生成package.json文件
E:Webpack-probject该目录下输入 npm install webpack --save-dev
未完...
以上是关于初始ES6-Webpack的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin类的初始化 ④ ( lateinit 延迟初始化 | ::属性名称.isInitialized 检查属性是否初始化 | lazy 惰性初始化 )
Kotlin类的初始化 ④ ( lateinit 延迟初始化 | ::属性名称.isInitialized 检查属性是否初始化 | lazy 惰性初始化 )