最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • js模块化规范浅析

    正文概述 掘金(smilehappily)   2021-05-20   485

    前言

    将所有的代码都写在一个文件或者模块里面,代码之间耦合性太强,任何修改都可能造成全局的污染,不利于后期的维护;并且同一个文件内功能不容易划分清晰,很难实现相同功能模块的重复利用。
    js模块化是将一个复杂的程序按照一定的规范封装成几个独立的模块,再将这几个模块组合在一起完成复杂程序的功能。模块内部的数据和方法是私有的,只是向外部暴露一些方法与外部的其他模块进行通信。
    主要浅析比较常用的三种模块化规范:commonjs、AMD(Asynchronous Module Definition)和es6,至于不常用的CMD(Common Module Definition)、UMD(Universal Module Definition)不在本文赘述。

    commonjs

    遵循commonjs规范的程序,每一个文件都可以当做是一个模块。模块在服务端运行时是同步加载的,在浏览器端无法直接运行,需要提前编译打包成浏览器能识别的规范。nodejs是遵循commonjs规范的实现。
    1. commonjs运行环境
    服务端:nodejs
    浏览器:无法在浏览器直接运行,需要借助打包工具打包成浏览器能识别的规范。

    2. commonjs示例

    commonjs规范通过以下两种方式对外暴露模块:
    (1)module.exports = value
    (2)exports.xxx = value
    exports默认为一个空对象。
    通过require引入使用模块:
    let module = require('./module')
    代码结构:

    js模块化规范浅析
    module1.js

    module.exports = {
        arr: [1, 2, 3],
        func: ()=>{
            console.log('module1')
        }
    }
    

    module2.js

    exports.arr = [1, 2, 3]
    exports.func = ()=>{
        console.log('module2')
    }
    

    main.js

    let module1 = require('./module1')
    let module2 = require('./module2')
    
    console.log(module1.arr)
    module1.func()
    
    console.log(module2.arr)
    module2.func()
    

    在node环境中运行main.js,输出为:

    [ 1, 2, 3 ]
    module1
    [ 1, 2, 3 ]
    module2 
    

    commonjs运行在浏览器
    遵循commonjs规范的代码不能直接在浏览器中运行,如下示例: 添加index.html文件,引用main.js,index.html为:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>commonjs</title>
    </head>
    <body>
        <script src="./main.js"></script>
    </body>
    </html>
    

    在浏览器打开以后,提示:

    js模块化规范浅析
    在浏览器运行之前,需要将遵循commonjs的代码编译打包成浏览器能识别的代码,这里使用browserify包(browserify.org/) 进行编辑打包:
    本地安装browserify
    npm install browserify --save-d
    对main.js进行打包
    browserify ./main.js -o ../dist/bundle.js
    index.html引入打包以后的文件

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>commonjs</title>
    </head>
    <body>
    <!--    <script src="./main.js"></script>-->
    <script src="../dist/bundle.js"></script>
    </body>
    </html>
    

    浏览器正常运行输出:

    js模块化规范浅析

    AMD

    AMD(Asynchronous Module Definition) 异步模块定义,主要用于浏览器端。
    1. AMD运行环境
    在浏览器端运行。
    2. AMD示例
    AMD定义暴露模块:
    (1)定义没有依赖的模块:

    define(function(){
        return 模块
    })
    

    (2)定义有依赖的模块:

    define(['module1', 'module2'], function(m1, m2){
        return 模块
    })
    

    AMD使用模块:

    require(['module1', 'module2'], function(m1, m2){
        m1
        m2
    })
    

    AMD运行需要下载requirejs,下载地址为:requirejs.org/docs/downlo…
    目录结构:

    js模块化规范浅析
    module1.js文件内容为

    define(function(){
        return 'module1'
    })
    

    module2.js文件内容为

    define(['module1'], function(m1) {
        return m1 + '+module2'
    })
    

    main.js文件内容为:

    requirejs.config({
        paths: {
            module1: './module/module1',
            module2: './module/module2',
        }
    })
    
    requirejs(['module1', 'module2'], function(m1, m2) {
        console.log(m1)
        console.log(m2)
    })
    

    index.html文件内容为:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>commonjs</title>
    </head>
    <body>
        <script data-main="./main.js" src="./libs/require.js"></script>
    </body>
    </html>
    

    在浏览器打开index.html,输出

    js模块化规范浅析

    ES6

    ECMAScript 6.0(简称 ES6)是 js 语言的下一代标准,在 2015 年 6 月发布第一个版本,一般提到ES6,都是指的ES2015标准。以后每年的6月份都发布一个新的版本,以年份作为标记,例如ES2015、ES2016等等。
    1. ES6运行环境
    ES6是针对js的规范,能运行js的环境就是ES6的运行环境。可能有些运行环境还不支持ES6的最新特性,所以一般是使用Babel 转码器(babeljs.io/) 将ES6代码转为ES5代码,然后在浏览器运行。
    2. ES6示例
    导出模块:export / export default
    引入模块:import
    目录结构:

    js模块化规范浅析

    module1.js文件

    let fn1 = function func1() {
        console.log('module1')
    }
    export {fn1}
    

    module2.js文件

    let fn2 = function func2() {
        console.log('module2')
    }
    export default fn2
    

    main.js文件内容

    import {fn1} from './module/module1.js'
    import fn2 from "./module/module2.js"
    fn1()
    fn2()
    

    index.html文件内容

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>commonjs</title>
    </head>
    <body>
        <script type="module" src="./main.js"></script>
    </body>
    </html>
    

    需要注意的是,浏览器支持es6语法的import和export,但是在引入js文件的时候,需要标注为module类型
    在浏览器打开index.html,输出

    js模块化规范浅析


    起源地下载网 » js模块化规范浅析

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元