阅读前:文章大概是写,简单用过webpack,想继续深入了解webpack前需要了解的知识。但文章内容跟webpack使用关系并不大。

文章概要:

  1. Object.defineProperty
  2. call 和apply
  3. 模块化规范
  4. webpack的小点
  5. 小结

1. Object.defineProperty

属性:数据属性(data property)存取器属性(accessor property),与属性相关联的值是属性特性。

1.1属性的特性

数据属性(data property)的特性:value,writable,enumerable,configurable。

存取器属性(accessor property)的特性: 取(get), 写入(set),enumerable,configurable。 

测试一下这两种属性的输出:

var testProperty = {
dataProperty: "I am data property",
} Object.defineProperty(testProperty, 'accessorProperty', {
get: function() {
return "I am accessor property"
},
set: function() {
console.log("set accessorProperty")
}
}) 

Chrome 控制台输出如下图:

1.2属性特性的使用

有意思的是(假设属性是可读/写的,既有getter 方法,又有setter 方法)属性进行读写的时候,会触发定义的getter 方法和setter 方法

那么在存取器属性,读写之间可以做的事情就很多了

eg.读 get

var getter = module && module.__esModule ? function getDefault() {
return module['default'];
} : function getModuleExports() {
return module;
}; // exports 假设 是一个已知 对象 那么此处定义的就是 exports.name 属性的特性, exports.name 的值依赖于getter
Object.defineProperty(exports, name, {
configurable: false,
enumerable: true,
get: getter
});

eg.写set

<div id="app">
<input type="text" id ="uName" />
<span id="userName"></span>
</div>
<script type="text/javascript">
var obj = {}
Object.defineProperty(obj, "test", {
set: function(val) {
document.getElementById("userName").innerText = val;
}
});
document
.getElementById("uName")
.addEventListener("keyup", function(event) {
obj.test = event.target.value;
});
</script>

set 和get 结合 ,将 data 的属性代理到对象vm 上

var vm = {}
var data = {
name: 'zhangsan',
age: 20
}
//这样通过 vm 可以访问 data的属性(vue 里面 大概也是这么代理的)
Object.keys(data).forEach(key => {
let internalValue = data[key]
Object.defineProperty(vm, key, {
get: function() {
console.log('get', data[key]) // 监听
return data[key]
},
set: function(newVal) {
console.log('set', newVal) // 监听
data[key] = newVal
}
})
})

2.call 和apply

函数的调用方式有4种

我们了解一下第四种

摘抄至JavaScript权威指南  call() 和apply()的第一个参数是要调用函数的母体对象,它是调用上下文,在函数体内通过this来获得对它的引用。

就是说,call()和apply()方法显示指定调用函数所需要的this值。(看起来就像,对象想用某个函数方法,但是这个对象又不想实现这个函数方法)

语法:

fun.call(thisArg, arg1, arg2, ...)

func.apply(thisArg, [argsArray])

eg.

2.1 call()和apply() 应用小例子

apply :参考

Math.max(10, 20);   //
var arr = [1, 2, 3];
Math.max.apply(null, arr); // arr.push(element1, ..., elementN) Array.prototype.push()语法
var arr1 = ["1","2","3"]
var arr2 = ["4","5","6"];
//concat 也能实现,但它实际上并不附加到现有数组,而是创建并返回一个新数组。
// 参数数组不能太大,会有超出JavaScript引擎的参数长度限制的风险
arr1.push.apply(arr1,arr2); //得到合并后数组的长度,因为push就是返回一个数组的长度

call: 参考

(function(modules) {
// The module cache 模块是否加载过
var installedModules = {};
// The require function
function __webpack_require__(moduleId) {
// Check if module is in cache
if (installedModules[moduleId]) {
return installedModules[moduleId].exports;
}
// Create a new module (and put it into the cache)
var module = installedModules[moduleId] = {
i: moduleId,
l: false,
exports: {}
};
// Execute the module function
// 拿到对应的模块modules[moduleId] 这是一个函数。
modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
// Flag the module as loaded
module.l = true;
return module.exports;
}
return __webpack_require__(__webpack_require__.s = 1);
})([
/* 0 */
function(module, exports) {
module.exports = "Hello World";
},
/* 1 */
function(module, exports, __webpack_require__) {
module.exports = __webpack_require__(0);
}
]);

3.模块化规范

内容太多~~ 下篇填坑。

但知道模块化还是很重要的,比如 (皮一下,知道规范方便写代码和读代码)

function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global.Vue = factory());
}

4.webpack的小点

4.1 webpack的几个思考

webpack是什么?

At its core, webpack is a static module bundler for modern JavaScript applications. When webpack processes your application, it internally builds a dependency graph which maps every module your project needs and generates one or more bundles.

webpack解决什么问题(看4.2)?

webpack怎么用?

webpack深入探索?

4.2简述webpack的版本更新

Webpack V1

  • 编译、打包
  • HMR (模块热更新)
  • 代码分割
  • 文件处理

Webpack V2

  • Tree Shaking
  • ES module(函数)
  • 动态 Import

Webpack V3

  • Scope Hoisting (作用域提升)
  • Magic Comments (配合动态import使用)

Webpack V4

  • 简化打包
  • 插件系统优化
  • webpack4支持模块类型增加:

javascript/auto: 在webpack3里,默认开启对所有模块系统的支持,包括CommonJS、AMD、ESM。
        javascript/esm: 只支持ESM这种静态模块。
        javascript/dynamic: 只支持CommonJS和AMD这种动态模块。
        json: 只支持JSON数据,可以通过require和import来使用。
        webassembly/experimental: 只支持wasm模块,目前处于试验阶段

4.3   4个核心概念

entry:打包的入口,单个或多个

output: 打包成的文件(bundle),一个或多个,配合CDN

Loaders: 处理文件,转化为模块

Plugins:代码分割,参与打包整个过程 ,打包优化和压缩,配置编译时的变量

5.小结

文中例子比较粗糙,理解不准确之处,还请教正。关于学习webpack前,可以了解的小知识点,也只是我自己在这个 阶段了解过的点,还有很多重要的点并未提及,要真的去理解webpack,还需多看文档,代码实践。

撒花~~ 结束

深入了解webpack前,可以了解的小知识点。的更多相关文章

  1. webpack+vue2实现旅游网小demo

    这两天自己练习做了一个webpack+vue2的旅游app小项目,涉及到的内容是vue组件.vue路由以及webpack打包.         目录文件设计: 有兴趣的可到我的百度网盘下载 链接: h ...

  2. Python-装饰器的进阶 小知识点

    ⼀. 通⽤装饰器的回顾 开闭原则: 对增加功能开放. 对修改代码封闭 装饰器的作⽤: 在不改变原有代码的基础上给⼀个函数增加功能 通⽤装饰器的写法: def wrapper(fn): def inne ...

  3. python小知识点总结

    小知识点总结 1.python2和python3的区别   python2 python3 默认编码 ascii utf-8 input() raw_input() input() print 可以不 ...

  4. 刚接触Linux,菜鸟必备的小知识点(一)

    身为一个将要大四的学生,而且还是学计算机的没有接触过linux简直是羞愧难当.这个假期做了一个软件测试员,必须要熟悉linux的操作,所以对于我这个菜鸟我也就说几点比较重要的小知识点吧. 第一.cd指 ...

  5. Java学习过程中的总结的小知识点(长期更新)

    Java学习过程中的总结的小知识点 (主要是自己不会的知识和容易搞错的东西) 计算某个程序运行的时间 long stime=System.currentTimeMillis(); copy3(file ...

  6. 【转】HTML5的小知识点小集合

    html5的小知识点小集合 html5知识   1.  Doctype作用?标准模式与兼容模式各有什么区别? (1).<!DOCTYPE>声明位于位于HTML文档中的第一行,处于<h ...

  7. AngularJS的小知识点

    小知识点:$scope和$rootScope (1)每次使用ngController指令,都会调用控制器的创建函数,创建出一个控制器对象. (2)每次创建一个控制器对象,AngularJS都会创建一个 ...

  8. js中关于value的一个小知识点(value既是属性也是变量)

    今天在学习input的value值时,发现这么一个小知识点,以前理解不太透彻. [1]以下这种情况是常见情况,会弹出“测试内容” <input type="button" v ...

  9. html5的小知识点小集合

      html5的小知识点小集合 html5知识   1.  Doctype作用?标准模式与兼容模式各有什么区别? (1).<!DOCTYPE>声明位于位于HTML文档中的第一行,处于< ...

随机推荐

  1. 你不知道的CSS单位

    CSS中大部分属性值都有对应的量词单位,常见的如描述盒模型尺寸的 width, height, margin, padding, border,又比如CSS3中的transform属性的一些值.下面的 ...

  2. UOJ#201. 【CTSC2016】单调上升路径 构造

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ201.html 题解 首先把题目里面的提示抄过来: 结论:假设带权无向图 G 有 100 个节点 1000 ...

  3. JDK 5~8的特性对比

    原文请参考:https://bbs.csdn.net/topics/392062347 jdk5新特性 1.自动装箱和拆箱2.枚举3.静态导入4.可变参数5.內省   是Java语言对Bean类属性. ...

  4. LightOJ 1031 Easy Game (区间DP)

    <题目链接> 题目大意: 给定一段序列,两人轮流取数,每人每次只能从序列的两端的任意一段取数,取的数字位置必须连续,个数不限,问你这两人取数的最大差值是多少. 解题分析: 每人取数时面对的 ...

  5. 数字图像特征提取之HOG特征

    1.灰度化:(以便可以使用sobel等算子计算梯度)2.gamma校正: (降低光照影响)3.求每个像素的梯度和方向: (利用任意一种梯度算子,例如:sobel,laplacian等,对该patch进 ...

  6. Django与Celery配合实现定时任务

    一.前言 Celery是一个基于python开发的分布式任务队列,而做python WEB开发最为流行的框架莫属Django,但是Django的请求处理过程都是同步的无法实现异步任务,若要实现异步任务 ...

  7. C++ STL常用容器浅析

    首先要理解什么是容器,在C++中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对象的指针,这种对象类型就叫做容器.简单来说 容器就是包含其他类的对象们的对象,当然这种(容器) ...

  8. 修改input和textarea的placeholder的颜色,限制文本框字数输入

    <style type="text/css"> textarea{ width: 400px; height:400px; resize: none; } .limit ...

  9. NOIP-无线网路发射器选址

    题目描述 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的129条东西向街道和129条南北向街道所形成的网格状,并且相邻的平 ...

  10. React(二)组件

    1.组件概念: 我理解的组件的概念就是复用性,一个组件开发完成后可以重复使用. 2.简单的组件编写 (1)在src中创建一个components的文件夹,里面创建一个header.js的文件 (2)在 ...