首页 > 其他分享 >前端模块化-Day43

前端模块化-Day43

时间:2022-10-03 15:00:07浏览次数:58  
标签:function console 模块化 前端 暴露 js 模块 foo Day43

前端模块化:

发展史:

① 全局函数模式:将不同的函数功能封装成不同的全局函数。(调用时会导致修改覆盖)

// 全局函数模式:将不同的功能封装成不同的全局函数

let msg = 'module1'
function foo() {
    console.log('foo()', msg);
}

function bar() {
    console.log('bar()', msg);
}

 

 

② namespace模式:立即执行函数(调用依然可以进行覆盖)

// namespace模式:简单对象封装

let obj = {
    msg: 'module2',
    foo() {
        console.log('foo()', this.msg);
    }
}

 

③ IIFE模式:匿名函数自调用(闭包)

// IIFE模式:匿名函数自调用(闭包)
(function (window) {
    let msg = 'module3'
    function foo() {
        console.log('foo()', msg)
    }
    // 给window添加属性将window暴露出来
    window.module3 = {
        foo: foo
    }
})(window)
------------------------------
<script>
        // 通过暴露给window的属性来调用方法
        window.module3.foo()
</script>

④ IIFE模式增强:引入依赖

// IIFE模式增强---引入依赖
(function (window, $) {
    let msg = 'module4'
    function foo() {
        console.log('foo()', msg);
    }
    window.module4 = foo
    $('body').css('background', 'blue')
    // 依赖注入
})(window, jQuery)
------------------------------------
<script>     window.module4() </script>

 

模块化规范:

CommonJS:每个文件都可当作一个模块。

  • 在服务器端:模块的加载是运行时同步加载的。
  • 在浏览器端:模块需要提前编译打包处理。

基本语法:

① 暴露模块:module.exports = value 或 exports.xxx = value

② 引入模块:require(xxx) :第三方模块,xxx为模块名。自定义模块,xxx为文件路径。

实现:

服务器端:Node.js

浏览器端:browserify进行打包处理(即CommonJS浏览器端的打包工具)

使用browserify:进行全局和局部安装npm命令。

进行打包处理:browserify js/src/app.js -d js/dist/bundle.js

 

AMD:专门用于浏览器端,模块的加载是异步的。使用require.js库

基本语法:define关键字定义模块,return 暴露模块

① 暴露模块:定义暴露模块

1.没有依赖的模块:define(function()){ return 模块 })

// 定义没有依赖的模块

define(function () {
    let name = 'dataService.js'
    function getName() {
        return name
    }
    // 暴露模块
    return { getName }
})

2.具有依赖的模块:define(['module1','module2'],function(m1,m2) { return 模块 })

// 定义有依赖的模块
define(['dataService', 'jquery'], function (dataService, $) {
    let msg = 'alerter.js'
    function showMeg() {
        console.log(msg, dataService.getName());
    }
    $('body').css('background', 'pink')
    // 暴露模块
    return { showMeg }
});

② 引入模块:requirejs(['module'],function(module)) { } 显式声明,依赖注入

需要配置属性:即requirejs.config({baseUrl:基本属性,paths:{导入的模块名:模块路径}})

(function () {
    requirejs.config({
        baseUrl: 'js/',
        // 基本路径
        paths: {
            dataService: './modules/dataService',
            alerter:'./modules/alerter',
            jquery:'./libs/jquery.min'
        }
        // 配置路径
        // 最终寻找路径为: 基本路径 + 配置路径
    })
    requirejs(['alerter'], function (alerter) {
        alerter.showMeg()
    })
})()
<!-- 引入require.js并指定主文件的入口 -->    
<script data-main="js/main.js" src="./js/libs/require.js"</script>

 

CMD:专门用于浏览器端,模块的加载是异步的。使用sea.js库,模块的加载是异步的。

基本语法:define定义,exports暴露。

① 定义暴露模块:

1.定义没有依赖的模块:

define(function(require,exports,value){
  exports.xxx = value 
  module.exports = value
})

2.定义有依赖的模块:

define(function(require,exports,module){
   // 引入依赖模块(同步)
    var module2 = require('./module2')
   // 引入依赖模块(异步)           
    require.async('./module3',function(m3){
    })
   // 暴露模块
    exports.xxx = value
})   

② 引入使用模块:

define(function(require){
    var m1 = require('./module1')
    var m4 = require('./module4') 
    m1.show()
    m4.show()     
})

 

ES6 Modules:依赖模块需要打包处理。(Babel将es6转化为es5,browserify打包js文件)

语法:进行之前需要配置好Babel和Browserify

1. npm init -y
2. npm i --save-dev @babel/core @babel/cli @babel/preset-env
3. 新建一个.babelrc文件 在里面写入以下代码
{"presets": 【"@babel/preset-env"】}
4. 写相关的模块代码
5.将es6转化为es5: babel js/src -d js/build

暴露模块:export

① 统一暴露:即普通暴露

// 统一暴露
function fun() {
    console.log('module2');
}
function fun2() {
    console.log('module2');
}
// 暴露整个对象
export { fun, fun2 }

② 分别暴露:即普通暴露

// 暴露模块 分别暴露
export function foo() {
    console.log('foo() module1');
}
export function bar() {
    console.log('bar() module1');
}

③ 默认暴露:export default

// 默认暴露 可以暴露任意数据类型 暴露数据就是接收的数据
// export default value
// 通过对象方式 暴露多个数据
export default {
    name: 'lwh',
    foo() {
        console.log('默认暴露的箭头函数');
    }
}

引入模块:import 对于普通暴露,必须使用对象解构赋值的方式进行引用。

默认模块则直接定义引入即可。

// 引入其他模块
// 语法:import xxx from ‘路径’
// 常规的暴露必须使用解构赋值的方式引用
import { foo, bar } from './module1'
import { fun, fun2 } from './module2'

 

标签:function,console,模块化,前端,暴露,js,模块,foo,Day43
From: https://www.cnblogs.com/LWHCoding/p/16750541.html

相关文章