独书先生 Menu

前端模块化总结 CommonJS/AMD/UMD/ES6

Function 时代

JSP项目中,直接在网页上添加一个script,jQuery写交互逻辑

优点:简单快速搭建demo

缺点:混乱,污染全局

例子一:

jQuery:

$(function(){

    // do something

});

或者

$(document).ready(function(){

    //do something

})

例子二:

JS:

document.ready(function () {

    alert('im document.ready');

});

window.onload = function () {

    alert('im window.onload');

};

 

闭包时代

用立即执行函数包裹作用域,

优点:可以防止全局污染;

缺点:变量常驻内存会消耗内存

 
例子一:

(function(){

    //Coding…

})()

例子二:

outObj  作为参数传递过去,不用每个语句都去找outObj,提高了效率

(function(outObj){

    var  a = 1;

    var  obj ={ b:2};

    window.obj = obj;

    return obj;

})( outObj)

 

例子三:常驻内存

function f1(){

    var n =9;

    nAdd=function(){

        n=n+1;

    }

    function f2(){

        console.log(n);

    }

    return f2;

}

var result=f1();

result(); //9

nAdd();

result();//10

注意点:全局变量不用了记得置为null,方便垃圾回收

 

 

模块化时代

CommonJS, AMD, CMD, UMD, ES6 规范(CMD已经淘汰)

 

CommonJS 规范

基本知识:
– require : 导入模块
– module.exports 或exports :导出模块

特点:
同步加载,依赖通过每个require一个个导入

例:

文件名: foo.js

// 依赖
var $ = require('jquery');

// 方法
function myFunc(){};
// 暴露公共方法(一个)
module.exports = myFunc;

注意点:

  1. exports 是对 module.exports 的引用
  2. 一个文件不能写多个module.exports ,如果写多个,对外暴露的接口是最后一个module.exports
  3. 模块如果没有指定使用module.exports 或者exports 对外暴露接口时,在其他文件就引用该模块,得到的是一个空对象{}

案列:

example1.js 文件

// 定义有依赖的模块

//CommonJS
var example2Obj = require('./example2');
example2Obj.sayHello();
module.exports = example2Obj;

 

example2.js 文件

//没有依赖的js
CommonJS
var me = {
        sayHello:function(){
        console.log('我是example2 in CommonJS!');
    }
};
module.exports = me;

main.js

//CommonJS / AMD
var example1Obj = require('./assets/example1');

console.log("example1 in main",example1Obj)

AMD 规范

基本知识:

  • define 或者 require():导入模块

  • return:导出模块

实际上也是一个闭包

define([module1,module2],function(){

    return {};

});

特点:异步加载,不阻塞页面的加载,通过define导入多个模块,

案例:

example1.js 文件

//AMD

define([
'./example2'
],function(example2Obj){
    example2Obj.sayHello();
    return example2Obj;
});

example2.js 文件

//AMD
define([
],function(){
    var we = {};
    return {
        sayHello:function(){
            console.log('我是example2 in AMD!');
        }
    };
});

main.js同CommonJS

UMD 规范

结合AMD + CommonJS的写法

(demo不生效,不举例了,有实验成功的童鞋分享下)

(function (root, factory) {

    if (typeof define === 'function' && define.amd) {

    // AMD

    define(['b'], factory);

    } else if (typeof module === 'object' && module.exports) {

    // CommonJS

    module.exports = factory(require('b'));

} else {

    // Browser globals

    root.returnExports = factory(root.b);

    }

}(this, function (b) {

    //use b in some fashion.

return {};

}));

ES6 规范

基本知识:
– import  导入
– export 或者 export default 导出

注意点:一个文件即模块中只能存在一个export default语句,export可以多个

案例:
example1.js 文件

//ES6
//名字任意
import ex2 from "./example2"
let ex1 = "ex1 ES6!!"
export {ex1,ex2}

example2.js 文件

//ES6
const str = "First ES6";
let obj = {
    func:() => {
        console.log("I am in ES6")
    }
}
//只能一个default
export default{
    str,
    obj
}

main.js

//ES6
import {ex1,ex2} from './assets/example1'
console.log("ex1:",ex1,"ex2:",ex2)

demo源代码见:https://github.com/Dushusir/js-module-demo

演示环境:vue + webpack

  1. 安装node
npm install -g vue-cli
vue init webpack myDemo
  1. cd myDemo

  2. npm run dev

  3. 去除eslint检查,防止对 “;” 报错:config/index.js中

module.exports = {

dev: {

//其他设置

useEslint: false,

参考:https://webpack.toobug.net/zh-cn/chapter2/commonjs.html ,感谢!

uglifyjs 快速批量压缩js文件 bat一键压缩混淆

背景

当前最好用的压缩混淆js插件:uglifyjs。

步骤

  1. 安装node + npm
  2. 打开cmd窗口,全局安装uglifyjs : npm install -g uglify-js

  3. 新建一个txt,再新建一个空白文件夹js, 把下方D:\tools\compresser_tool\js改成你自己的空白文件夹(js)目录,用于存放将要压缩的js文件
    Continue reading…

编写一个函数,将除最后四个字符之外的所有字符都改为’#’

codewars在线编程练习总结:信用卡数组隐藏

问题:编写一个函数maskify,它将除最后四个字符之外的所有字符都改为’#’。

列子:

maskify("4556364607935616") == "############5616"
maskify( "64607935616") == "#######5616"
maskify( "1") == "1"
maskify( "") == ""
maskify("Skippy") == "##ippy"
maskify("Nananananananananananananananana Batman!") == "####################################man!"

Continue reading…

js实现 Excel通配符比较两个字符串

需求分析:

a 与 b比较(a和b可为字符串或数字),其中b的内容比较丰富,开头可含比较符(>, >=, <, <=, =),任意位置可含通配符(Excel规则:   ?  ~  ~?), 返回Boolean(true or false)

通配符规则:

?(问号)

任何一个字符
例如,sm?th 可找到“smith”和“smyth”
*(星号) 任意的数量字符
例如,*east 可找到“Northeast”和“Southeast”
~(波形符)后跟 ?、* 或 ~

问号、星号或波形符
例如,fy06~? 可找到“fy06?”

通配符的使用详细参照Excel官网
Continue reading…

Node搭建本地服务器

除了使用 Python搭建本地服务器,还可以前端程序员可以直接使用Node搭建简易服务器

  1. Node.js官网下载对应自己电脑的最新版Node 安装(注意:默认安装不用设置环境变量,否则需要手动配置环境变量)

  2. WIN + R 进入CMD命令行界面 ->  输入:node -v  -> 按Enter , 显示版本号即安装成功

  3. CMD命令行继续输入,

    • Windows输入: npm install anywhere -g
      MAC输入:sudo npm install anywhere -g
  4. CD到你的项目所在的文件夹,输入:anywhere

精确判断js对象类型的方法

1.区别数组还是对象

var arr = [1, 2, 3];

var obj = {“a”: 3, “b”: 4};

判断数组:typeof arr  == “object” && arr.length != undefined

或者arr instanceof Array == true

注意 :arr instanceof Object == true所以instanceof和typeof一样不能单独使用来判断对象

判断对象:typeof obj== “object” && obj.length == undefined

原理:(1) 数组和对象使用typeof都是object

(2) 对象没有长度

 

2.判断数据类型:

编写数据类型判断的通用函数

function getType(obj){
var toString = Object.prototype.toString;
var map = {
'[object Boolean]' : 'boolean',
'[object Number]' : 'number',
'[object String]' : 'string',
'[object Function]' : 'function',
'[object Array]' : 'array',
'[object Date]' : 'date',
'[object RegExp]' : 'regExp',
'[object Undefined]': 'undefined',
'[object Null]' : 'null',
'[object Object]' : 'object'
};
if(obj instanceof Element) {
return 'element';
}
return map[toString.call(obj)];
}

引用自:sysuzhyupeng 感谢!

前端开发资源工具汇总 | 长期更新

vue

vue

1.编程学习: 视频教程: imooc.com cn.udacity.com

文档: 菜鸟教程 实验楼 谷歌开发者 MDN WEB

2.js在线编程工具: jsbin.com jsrun.net jsfiddle.net codepen.io

3.开发框架 前端三大框架:Vue  /  angular   /  React

UI库:element  /  antd  / material.io

web app:   PWA  + AMP

原生APP:flutter + Dart  / React Native  / 安卓Kotlin

4.开源开发库

css3动画库:animate.css

JS动画库:  Velocity.js

canvas 库:spritejs.org

5.HTML5游戏开发

引擎: phaser.io / phaser Examples  cocos.com egret.com

js库:2D js物理引擎: Arcade Physics matter.js

教程:html5gamedevs.com gamedevjs.com

6.产品设计 shejidaren.com relativewave.com principleformac.com  (收费+MAC)

剪切一个HTML元素到页面上的另一个地方 | Web基础

前端基础知识点巩固

方法:先clone 再append

代码:

HTML:

<div class="container">
    <div class="div1">
        <p class="p1" style="color:red;">
            文字
        </p>
    </div>
    <div class="div3"></div>
</div>

JS:

var $p1 =$(".div1").find(".p1");
var copyP = $p1.clone(true);
$(".div3").append(copyP);
$p1.remove();

 

PS :1.样式也会带过去

2.记得引用jQuery