SeaJs的使用方法

案例 转载于 https://github.com/linwalker/seajs-demo

<script src="sea-module/sea.js"></script>
<!--<script src="sea-module/jquery/jquery.js"></script>-->
<!--<script src="sea-module/select2/select2.js"></script>-->
<script>
    seajs.config({
        alias:{
            'changeText':'../static/changeText.js',
            'jquery':'jquery/jquery',
            'main':'./static/main.js'
        },

    });
    seajs.use(['main','jquery'],function(main,$) {
        $('#title').after('<button id="show">showText</button>');
        $('#show').on('click',function() {
            main.showText()
        })
    });

</script>

main.js

/**
 * Created by linyuhua on 2017/1/14.
 */
define(function (require, exports, module) {
    var changeText = require('changeText');
    var $ = require('jquery');
    var showText = function () {
        $('#title').text(changeText.init());
    }
    exports.showText = showText;
})

changeText.js

/**
 * Created by linyuhua on 2017/1/14.
 */
define(function (require, exports, module) {
    var init= function() {
        var textContent = [
            'yes it works',
            'seajs demo',
            'it is a lucky day',
            'wish this help you',
            'thank you for reading'
        ];
        var index = Math.floor(Math.random()*textContent.length);
        return textContent[index];
    }
    module.exports = {
        init:init
    }
})

seajs是啥,可以看看这篇前端模块化(CommonJs,AMD和CMD)
点我点我--项目源码地址:https://github.com/linwalker/seajs-demo

本文所用例子的代码目录结构:

  1. seajs example
  2. |--sea-module //存在依赖文件
  3. |--jquery
  4. |--jqeury.js
  5. |--sea.js
  6. |--static //存放自定义模块js
  7. |--main.js
  8. |--index.html //调用页面

seajs页面引入

下面开始,首先看下index:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>seajs example </title>
  6. </head>
  7. <body>
  8. <h1 id="title">seajs demo </h1>
  9. <script src="sea-module/sea.js"> </script>
  10. <script>
  11. seajs.use( './static/main.js' );
  12. </script>
  13. </body>
  14. </html>

首先引入sea.js文件,然后通过seajs.use加载main.js文件。我们再来看看main.js:

  1. define(function(require,exports,module) {
  2. var title= document.getElementById('title');
  3. title.innerHTML = "yes it works"
  4. })

define()用来定义模块文件,具体参数等介绍可以参考文章开头介绍的文章。此处,页面会输出yes it works,是main.js修改了id为title的标签的文本内容,并没有引用其他模块文件。

模块文件引入

我们自定一个模块changeText.js:

  1. define(function (require, exports, module) {
  2. var textContent = 'yes it works';
  3. exports.text = textContent;
  4. //or
  5. //module.exports = {
  6. //text: textContent
  7. //}
  8. })

changeText模块输出了一个text变量,然后我们在main中引用它:

  1. define(function (require, exports, module) {
  2. var changeText = require('../static/changeText.js');
  3. var title = document.getElementById('title');
  4. title.innerHTML = changeText.text;
  5. })

我们通过require将changText模块的输出对象赋值给changeText变量,然后将对象的text属性赋值给节点的文本值,此时页面输出效果是一样的。

别名设置

引入一个模块要写他的相对路径,我们可以给它取个别名,在seajs.use()上面加入这一段代码:

  1. <script>
  2. seajs.config({
  3. alias:{
  4. 'changeText' : '../static/changeText.js'
  5. }
  6. });
  7. seajs.use( './static/main.js' );
  8. </script>

通过config中alias给'../static/changeText.js'设置了别名changeText,现在main中引用changeText模块就可以直接写成这样了var changeText = require('changeText')

模块调用

下面试着引入一个模块的方法,将changeText改为:

  1. define(function (require, exports, module) {
  2. var init= function() {
  3. var textContent = [
  4. 'yes it works',
  5. 'seajs demo',
  6. 'it is a lucky day',
  7. 'wish this help you',
  8. 'thank you for reading'
  9. ];
  10. var index = Math.floor(Math.random()*textContent.length);
  11. return textContent[index];
  12. }
  13. module.exports = {
  14. init:init
  15. }
  16. })

模块中定义了一个init方法,它随机返回数组中的一条。然后我们将main修改下:

  1. define(function (require, exports, module) {
  2. var changeText = require('changeText');
  3. var title = document.getElementById('title');
  4. title.innerHTML = changeText.init();
  5. })

这时候我们每次刷新页面都会随机出现一条文字。

第三方文件引用

下载一个jquery源文件,按如下修改:

  1. define(function (require, exports, module) {
  2. jquery 源码
  3. })

使其模块化,能被外部调用。

然后再设置别名:

  1. seajs.config({
  2. alias:{
  3. 'changeText': '../static/changeText.js',
  4. 'jquery': 'jquery/jquery',
  5. 'main': './static/main.js'
  6. }
  7. });
  8. seajs.use( './static/main.js');

在main中引入jquery,并使用:

  1. define(function (require, exports, module) {
  2. var changeText = require('changeText');
  3. var $ = require('jquery');
  4. $('#title').text(changeText.init());
  5. })

回调函数

seajs.use([module],callback),加载一个或多个模块,并执行回调函数。我们将main修改下:

  1. define(function (require, exports, module) {
  2. var changeText = require('changeText');
  3. var $ = require('jquery');
  4. var showText = function () {
  5. $('#title').text(changeText.init());
  6. }
  7. exports.showText = showText;
  8. })

然后增加回调函数:

  1. seajs.use(['main','jquery'],function(main,$) {
  2. $('#title').after('<button id="show">showText</button>');
  3. $('#show').on('click',function() {
  4. main.showText()
  5. })
  6. });

上述代码我们加载了两个模块,并把它们输出的对象传参给main和$变量,通过点击事件调用main中的showText方法,而showText方法调用了changeText中的init方法。

路径问题

我们先来搞清几个问题:

  1. ./是表示当前目录;../是上级目录;
  2. seajs.config 里alias的别名设置只是给路径取个别名,减少书写;
  3. seajs里主要两个用到路径的地方:一个是seajs.use();一个是require()。
  4. base路径是seajs文件所在目录,本例子为 (file:///Users/linyuhua/code/seajs/sea-module/)

先来讲seajs.use()路径

seajs.use()调用模块文件的路径默认是seajs文件的父文件夹目录;以本例子来解释:
首先来回看下我们的目录结构:

  1. seajs example
  2. |--seajs
  3. |--sea-module //存在依赖文件
  4. |--jquery
  5. |--jqeury.js
  6. |--sea.js
  7. |--static //存放自定义模块js
  8. |--main.js
  9. |--changeText.js
  10. |--index.html //调用页面

调用main可以通过以下路径:

  1. seajs.config({
  2. alias:{
  3. 'changeText':'../static/changeText.js',
  4. 'jquery':'jquery/jquery',
  5. 'main':'./static/main.js'
  6. }
  7. });
  8. seajs.use(['main','jquery'],function(main,$) {
  9. ...
  10. })
  11. });
  12. // ./表示当前路径,seajs.use的默认路径是seajs文件的父文件夹的目录;即file:///Users/linyuhua/code/seajs/;
  13. // 因此,此时main的调用路径为file:///Users/linyuhua/code/seajs/static/main.js

在举个例子来证明,这次我们使用../来设置路径:

  1. seajs.config({
  2. alias:{
  3. 'changeText':'../static/changeText.js',
  4. 'jquery':'jquery/jquery',
  5. 'main':'../seajs/static/main.js'
  6. }
  7. });
  8. seajs.use(['main','jquery'],function(main,$) {
  9. ...
  10. })
  11. });
  12. // ../表示上级目录,seajs.use()的目录为file:///Users/linyuhua/code/seajs/;
  13. // 他的上级目录为file:///Users/linyuhua/code/,因此此时main的别名设置为../seajs/static/main.js;
  14. // 合并之后就是file:///Users/linyuhua/code/seajs/static/main.js

最后再来看看jquery的调用,直接以文件名开头,在seajs中直接以文件名开头的路径是相对于base路径,也就是说当把jquery别名设置为'jquery':'jquery/jquery',时,他的调用路径为
base+‘jquery/jquery’(.js可以省略);即file:///Users/linyuhua/code/seajs/sea-module/+jquery/jquery;

require()调用路径

下面我们来看看require调用的路径

首先是./../
在define(function (){ }), 则是相对于当前的js文件所在目录,还记得main中怎么调用changeText.js和jquery的吗:

  1. //对照别名设置
  2. seajs.config({
  3. alias:{
  4. 'changeText':'../static/changeText.js',
  5. 'jquery':'jquery/jquery',
  6. 'main':'../seajs/static/main.js'
  7. }
  8. });
  9. define(function (require, exports, module) {
  10. var changeText = require('changeText');
  11. var $ = require('jquery');
  12. var showText = function () {
  13. $('#title').text(changeText.init());
  14. }
  15. exports.showText = showText;
  16. })

由于在define(function (){ }), 则是相对于当前的js文件所在目录,所以../表示changeText.js的上级目录即file:///Users/linyuhua/code/seajs,加上别名就是file:///Users/linyuhua/code/seajs/static/changText.js;

我们也可以直接require('./changeText.js')来调用,./表示当前目录,而changeText.jsmain.js在同一个目录下;

如果路径以文件名开头则是相对base路径,与前面seajs.use()一样,jquery:jqeury/jquery就是相对base路径调用的。


猜你喜欢

转载自blog.csdn.net/sd19871122/article/details/80925804