• Stars
    star
    198
  • Rank 195,583 (Top 4 %)
  • Language
    JavaScript
  • Created about 8 years ago
  • Updated about 5 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

《RequreJS学习笔记》

RequireJS

require.js加载js文件的好处

  1. 可以防止JS加载时候阻塞页面渲染(JS运行时候DOM停止渲染的情况)
  2. 使用require.js调用的方式加载JS,不用在像以前那样多个<script>标签引入JS文件

所有代码的目录结构如图

这里写图片描述

代码存放的Github地址

传统的引入

start.html

<!DOCTYPE html>
<html>
<head>
    <script type="text/javascript" src="js/require.js"></script>
    <script type="text/javascript" src="js/a.js"></script>
</head>
<body>
    <p>wsscat</p>
</body>
</html>

传统方法引入可以看到会先弹出alert,内容被阻塞没有渲染

a.js

function cat() {
    alert("hello");
}
cat();

require.js的引入

start.html

<!DOCTYPE html>
<html>
<head>
    <script type="text/javascript" src="js/require.js"></script>
    <script>
        require(["js/a"]);
    </script>
</head>
<body>
    <p>wsscat</p>
</body>
</html>

a.js

define(function () {
    function cat() {
        alert("hello");
    }
    cat();
})

现在应require里面写可以避免以前的写法导致alert弹窗时候页面的p标签内容被阻塞无法渲染

现在这种写法格式是用define定义一个模块,并在页面中调用require方法引入

要注意的是,require接受的是一个数组,它注入的依赖是一个数组,哪怕数组只有一个依赖,而它第二个参数则可以传入一个回调函数,就是党数组中的依赖都加载完毕后,执行这个回调函数,比如我们可以加载jQuery的依赖,然后再回调函数中调用jQuery的库

require(["js/a"]);

config方法

我们可以在上面代码上继续改进,可以用require.js的config方法,通过paths属性,就不用每次都写这么长的引入地址,有点像angular的服务注册,然后在控制器中注入相应的服务

base.js

require.config({
    paths: {
        "jq": ["http://wsa.wsscat.com/jquery", "js/jquery"],
        "a": "js/wsscat"
    }
})

注意加载模块时不用写.js后缀,写了会报错 我们可以把配置这样引入到主页里面

<script type="text/javascript" src="js/require.js"></script>
<script type="text/javascript" src="js/base.js"></script>

##path属性 用paths还有一个好处就是让我们配置多个路径去加载js,当我们请求第一个路径不成功时候,可以继续往后面请求第二个js路径代替 这里写图片描述

##data-main 我们还可以这样引入,在require引入的script标签中加入data-main属性,后面就不用在显式用<script>标签引入其他脚本文件了

<script type="text/javascript" data-main="js/base" src="js/require.js"></script>

base.js

require.config({
    baseUrl: 'js',
    paths: {
        jq: ["http://wsa.wsscat.com/jquery", "jquery"],
        a: "wsscat"
    }
})
require(["jq", "a"], function () {
    $('span').css('color', '#673AB7');
});

可以看到已经成功加载到我们所需要的依赖了 这里写图片描述

RequireJS的模块语法允许它尽快地加载多个模块,虽然加载的顺序不定,但依赖的顺序最终是正确的,就是说模块是异步不按顺序加载,但使用的时候只要依赖的顺序正确那就会按依赖摆放的顺序执行

上面我们可以把之前的代码改进成这样,用define采用AMD规范,把方法写进模块里面,并以对象传递出来 wsscat.js

define(
    function () {
        function fun1() {
            alert("wsscat");
        }

        function fun2() {
            alert("autumns");
        }
        return {
            f1: fun1,
            f2: fun2
        }
    }
)

base.js

require.config({
    baseUrl: 'js',
    paths: {
        jquery: ["http://wsa.wsscat.com/jquery", "jquery"],
        a: "wsscat"
    },
})
require(["jquery", "a"], function ($, a) {
    console.log($('span'));
    $('span').css('color', '#673AB7');
    console.log(a);
});

然后注入a的JS,并依赖此服务,是输出a,就能看到我们刚才模块给的对象里面的两个函数

这里写图片描述

模块依赖另一个模块

如果我们在一个依赖中还要再去依赖另一个JS,理解来相当于angular在服务中还需要注入其他服务来扩展 我们就可以继续这样改,在define中加入一个数组,让我们想把需要的依赖给填充进去,记得回调函数里面需要把这个依赖也加进去形参里面 wsscat.js

define(['wsscat2'],
    function (wsscat2) {
        function fun1() {
            alert("wsscat");
        }

        function fun2() {
            alert("autumns");
        }

        return {
            f1: fun1,
            f2: fun2,
            f3: wsscat2.f1
        }
    }
)

wsscat2.js

define(
    function () {
        function fun1() {
            return "wsscat2.js's wsscat";
        }

        function fun2() {
            return "wsscat2.js's autumns";
        }
        return {
            f1: fun1,
            f2: fun2
        }
    }
)

上面我们就完成了wsscat这个模块依赖了wsscat2模块,然后再次输出新的对象方法

这里写图片描述

shim(非AMD写法的兼容)导入单个变量

当我们遇到非AMD兼容写法的时候,我们要可以用exports方法,注意的是export方法只能输出一个方法或者对象 base.js

require.config({
    //可以把下面共同指向js文件夹写在这个位置
    baseUrl: 'js',
    //path可以让我省略冗长的地址信息
    paths: {
        //可以配置多个路径,当js请求不成功,可以有备选路径
        jquery: ["http://wsa.wsscat.com/jquery", "jquery"],
        //define中再依赖其他模块
        a: "wsscat",
        //define遵从AMD的写法
        b: "wsscat2",
        //export一个对象
        c: "wsscat3",
        //export一个函数
        d: "wsscat4"
    },
    //非AMD规范时候的兼容写法
    //export暴露出对应的对象和方法
    shim: {
        c: {
            //导出对象
            exports: "obj",
        },
        d: {
            //导出方法
            exports: "fun4"
        }
    }
})
//注入对应依赖,当依赖都请求成功后执行对应的回调函数
require(["jquery", "a", "c", "d"], function ($, a, c, d) {
    console.log($('span'));
    $('span').css('color', '#673AB7');
    console.log(a.f3());
    console.log(c);
    console.log(d);
});

wsscat3.js

function fun1() {
    return "wsscat3.js's wsscat";
}

function fun2() {
    return "wsscat3.js's autumns";
}
var obj = {
    f1: fun1,
    f2: fun2
}

wsscat4

function fun4() {
    return "wsscat4.js's wsscat";
}

上面我们就可以用exports方法分别把wsscats3和wsscat4里面的对象和方法暴露出来了

init(非AMD写法的兼容)导入多个变量

e: {
    init: function() {
        return {
            fun5: fun5,
            fun6: fun6
        }
    }
}

我们可以用init方法来导入多个变量,比shim属性导入单个零活,注意return里面的属性值是没有双引号的

require/text

我们利用text插件为组件引入html和css

使用npm下载require/text模块或者在github中下载text.js文件

npm install requirejs/text

然后在配置文件

require.config({
    baseUrl: 'js',
    paths: {
        text: ["text"],//<-添加这一个模块
        jquery: ["jquery"],
        bsheader: "../extends/bsheader/bsheader",
        bsmain: "../extends/bsmain/bsmain",
        bsfooter: "../extends/bsfooter/bsfooter",
        bsmodal: "../extends/bsmodal/bsmodal"
    }
})

//并注入对应依赖,当依赖都请求成功后执行对应的回调函数
require(["jquery", "text", "bsheader", "bsmain", "bsfooter"], function ($, text, bsheader, bsmain, bsfooter) {
    console.log(text);
    $("bsheader").bsheader();
    $("bsmain").bsmain();
    $("bsfooter").bsfooter();
});

然后我们就可以在组件中这样引入css和html文件了,注意要先插入html到页面再绑定事件,不然事件会失效,并且引入html和css文件时候要记得这样引入text!./bsfooter.htmltext!加上文件路径的名字

define(["jquery", "text!./bsfooter.html", "text!./bsfooter.css"],
    function ($, html) {
        var html = html;
        return $.fn.extend({
            bsfooter: function (option) {
                return this.each(function () {
                    $(this).html(html);
                });
            }
        });
    }
)

More Repositories

1

articles

🔖My Learning Notes and Memories - 分享我的学习片段和与你的回忆
Lua
3,167
star
2

piano

🎹Play the piano with the keyboard - 用键盘8个键演奏一首蒲公英的约定送给自己或月亮代表我的心送给她
JavaScript
1,118
star
3

CV

🙈Front End Engineer Curriculum Vitae - 面试宝典和简历生成器
HTML
1,036
star
4

node-tutorial

☺️Some of the node tutorial -《Node学习笔记》
JavaScript
519
star
5

vue-tutorial

🎃 Some of the vue-tutorial - 《Vue学习笔记》
493
star
6

vue-cli

📃基于 Vue3.0 Composition Api 快速构建实战项目
Vue
477
star
7

emoji

⭕〽️❗Omi Emoji
JavaScript
425
star
8

react-tutorial

🐅Some of the react tutorial - 《React学习笔记》
JavaScript
422
star
9

angular-tutorial

🐰Some of the angular tutorial - 《Angular学习笔记》
387
star
10

news

🐼Based on angular.js, weui and node.js rewrite news client - 新闻客户端
JavaScript
362
star
11

vue-awesome-mui

🏆Mui component for Vue.js(1.x ~ 2.x)
JavaScript
350
star
12

iPhone-X

🐳A simple and easy way to keep your custom views layout properly on iPhone X
CSS
340
star
13

socket.io

NodeJS《你画我猜》游戏
JavaScript
310
star
14

layout-demo

Various Layouts Of CSS
Lua
300
star
15

cms

News Management System Written In PHP - 从零开始用 PHP 实现内容管理系统后台
HTML
292
star
16

blog

Waving wild hands in the wind, writing brilliant poems, no matter how tired
HTML
277
star
17

webpack

📜Some of the node tutorial -《Webpack学习笔记》
JavaScript
276
star
18

littlefish

How far a life has to go, and how many years have passed before we can reach the end
CSS
259
star
19

compile-hero

🔰Visual Studio Code Extension For Compiling Language
TypeScript
254
star
20

wechat-jump-game

😊 Nodejs 微信《跳一跳》辅助
JavaScript
252
star
21

workerman

Workerman框架二次开发
PHP
249
star
22

wechat-tnwz

Nodejs 微信《头脑王者》辅助
JavaScript
230
star
23

openharmony-sheet

📊从零开始使用华为鸿蒙 OpenHarmony 开发游戏和表格渲染引擎
JavaScript
224
star
24

browser-preview

🎢Preview html file in your default browser
TypeScript
195
star
25

virtual-dom

关于Vue,React,Preact和Omi等框架源码的解读
HTML
191
star
26

awesome

🚠Algorithm And Data Structure
JavaScript
188
star
27

omi-snippets

🔖Visual Studio Code Syntax Highlighting For Single File React And Omi Components - 编写React和Omi单文件组件的VSC语法高亮插件
HTML
186
star
28

omil

📝Webpack loader for Omi.js React.js and Rax.js components 基于 Omi.js,React.js 和 Rax.js 单文件组件的 Webpack 模块加载器
JavaScript
180
star
29

glup

Some of the gulp tutorial -《gulp笔记》
JavaScript
174
star
30

search-online

🔍A simple extension for VSCode to search online easily using search engine.
TypeScript
164
star
31

python-tutorial

🏃 Some of the python tutorial - 《Python学习笔记》
JavaScript
157
star
32

regular

🔍The convenient paste of regular expression🔎
153
star
33

leetcode

leetcode
HTML
149
star
34

trip

Angular 仿携程的 demo
CSS
148
star
35

awesome-harmony

收录来源于网上鸿蒙系统开发的相关资料
JavaScript
147
star
36

omi-electron

🚀Build cross platform desktop apps with Omi.js and Electron.js 基于Omi.js和Electron.js构建跨平台的桌面应用
HTML
146
star
37

egret

🐦Some of the egret tutorial -《白鹭引擎笔记》
JavaScript
146
star
38

less-demo

JavaScript
146
star
39

weixin-demo

JavaScript
143
star
40

swiper-iscroll-demo

JavaScript
141
star
41

see-you-again

😊 Because love is very heavy, but I don’t want to understand it, I’m afraid of being touched, I only walk in the opposite direction, with my back to the wet pupils, please let go, seek your own sky, if you lose, you’re tired, remember to turn around See You Again My Class~
141
star
42

cordova-demo

Objective-C
138
star
43

git-test

136
star
44

spy

A simple module that displays DOM attributes on mouseover inside a tooltip.
JavaScript
136
star
45

react-native

📱Test Directory Of React Native
JavaScript
135
star
46

create-angular-app

基于 Webpack 自定义 Angular 脚手架
TypeScript
135
star
47

react-redux

《Redux笔记》
JavaScript
132
star
48

vueno

Vue Conversion Plugin
JavaScript
124
star
49

create-react-app

基于Webpack自定义React脚手架
JavaScript
124
star
50

performance-decorator

🏇User behavior & Function execution tracking solution - 大型前端项目的用户行为跟踪,函数调用链分析,断点调试共享化和复用化实践
110
star
51

omi-docs

📃Omil 文档
HTML
100
star
52

jest-tutorial

🎪Jest Architecture -《从零开始实现一个 Jest 单元测试框架》
JavaScript
97
star
53

intersect

一道面试题的思考 - 6000万数据包和300万数据包在50M内存使用环境中求交集
JavaScript
97
star
54

media-tutorial

流处理,TCP和UDP,WebRTC和Blob
JavaScript
83
star
55

prototype

📖Prototype Document
82
star
56

vue-snippets

Visual Studio Code Syntax Highlighting For Vue3 And Vue2
JavaScript
68
star
57

sheet

📊OpenHarmony Sheet 表格渲染引擎
JavaScript
59
star
58

sweet

🍡Life needs a little sweet
52
star
59

html-snippets

Full HTML tags including HTML5 Snippets.
50
star
60

bullshit-generator

Greatly improve the production efficiency of nonsense.
TypeScript
49
star
61

command-runner

💻A VSCode extension that simply obtains the file path and executes the corresponding command
TypeScript
48
star
62

Wscats

👨‍🚒 About me
48
star
63

flappy

🐧OpenHarmony Flappy Bird
JavaScript
47
star
64

github-actions-tutorial

➿Github Action Tutorial - 《Github Action教程》
JavaScript
46
star
65

uni-app

Support commonly used code snippets in Hbuilder/HbuilderX.
Lua
43
star
66

chrome-devtools-cli

Google Chrome Extension CLI
JavaScript
43
star
67

yox-snippets

Visual Studio Code Syntax Highlighting For Yox
TypeScript
42
star
68

ACEM

TypeScript
42
star
69

java-snippets

Provide Java development 35000+ code snippets and detailed interface reminders, which greatly improves your development efficiency
HTML
42
star
70

dnd-tutorial

拖拽示例
TypeScript
42
star
71

chatgpt-demo

A demo repo based on OpenAI GPT-3.5 Turbo API
TypeScript
42
star
72

lerna-tutorial

💈Some of the lerna tutorial - 《Lerna学习笔记》
JavaScript
42
star
73

delete-node-modules

✂️ Simple extension for Visual Studio Code that allows you to quickly delete your project's node_modules directory
JavaScript
41
star
74

dependency-injection

🌀Dependency injection to achieve inversion of control -《从零开始实现依赖注入框架》
TypeScript
41
star
75

vscode-clipboard

一款 VSCode 插件,用于保留项目的复制和剪切内容,并可在面板的历史记录中重新选择粘贴。
TypeScript
41
star
76

vue-extension-pack

🚚Popular VS Code extensions for Vue.js development.
Vue
40
star
77

react-extension-pack

🚚Popular VS Code extensions for React.js development.
40
star
78

webpack-nx-build-coordination-plugin

Use to coordinate the compiling of the libs and the webpack linking.
TypeScript
40
star
79

monorepo-tutorial

💈Some of the lerna tutorial - 《Lerna学习笔记》
JavaScript
39
star
80

angular-extension-pack

🚚Popular VS Code extensions for Angular development.
39
star
81

assemblyscript-tutorial

Learning about webassembly
HTML
39
star
82

lazy-preload

Wraps the React.lazy API with preloaded functionality.
TypeScript
38
star
83

theia-extension

TypeScript
37
star
84

vscode-explore

Learning about vscode
TypeScript
37
star