模块化

109 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

复杂文件封装成几个文件或者几个模块 解决各个模块之间的耦合性 命名之间的冲突

模块化

全部写在一个文件中 命名污染

//mod.js
var msg = '111'
function add(){
}
function some(){
}

//html
<script>
var msg = '222'
忘记mod.js中写入过msg,污染了变量
</script>

NameSace模式 减少全局变量 避免命名冲突 但是保存在对象中不安全

var MYAPP = {
    msg:'111',
    fn(){
        console.log(this.msg)
    }
}
MYAPP.fn() //111
MYAPP.msg = '222'
MYAPP.fn() //222
变量被修改 不安全

IIFE立即执行函数 相对安全 外界操作不到

image.png

var modules = (function(){
    var _private = 'safe'
    var foo = function(){
    }
    retrun {
    foo:foo
    }
})()
modules._private //undefined
modules.foo() //undefined

image.png

引入依赖 模块模式 现代模块实现的基石

image.png image.png

为什么要模块化

降低复杂度 提高解耦性

部署优化 某个Js模块只针对某个功能进行开发 其他模块中没有必要再进行引入 按需加载

可维护性更高

高复用性

image.png 如果没有模块化规范 现实是在写模块化中 可能引起 十次标签意味着发十次请求 而且各个script之间可能存在互相依赖 依赖模糊 修改一个文件可能其他文件跟着报错 请求过多

image.png

commonjs 有require语法 export暴露语法 每个文件都是一个模块 浏览器端:需要提前打包编译 打包工具是browrify

服务端:模块同步加载 需要加载某个模块可能需要再服务端进行等待 导致页面白屏

语法 有require语法 export暴露语法 暴露的本质是对象 module.export本身就是一个对象 只是value把它覆盖了

image.png

image.png

package.json 处在根目录 必须要有俩个字段 name version 用于下载 更新

commonjs在node的应用

image.png

image.png

image.png

commonjs在浏览器的应用

使用browserify --dev表示只在开发使用 线上运行不使用这个包 因为只是帮助我们进行打包 上线没有其他用处

客户端在使用src引入app.js的时候 使用require方法 浏览器不会识别出来 需要借助打包工具

image.png

开发和线上的包放在不同的地方

image.png

npm install的时候回创建node_modules

使用工具 找到目标文件达到 输出文件 image.png

AMD 没有amd的写法

image.png

image.png

image.png image.png

AMD规范