zoukankan      html  css  js  c++  java
  • 前端框架Vue自学之前端模块化(补充)

    目标:了解一下前端模块化的知识

    内容:用于记录一些心得。(前端模块化)

    正文:

    一、JavaScript原始功能

      在网页开发的早期,JS作为一种脚本语言,做一些简单的表单验证或者动画实现,那个时候代码还是很少的,一般是直接写在<script>标签中。

    二、存在问题

      随着AJAX异步请求的出现,慢慢形成了前后端的分离。客户端需要完成的事情越来越多,代码量也是与日俱增。为了应对代码量的剧增,我们通常会将代码组织在多个JS文件中,进行维护。但是这种维护方式,依然不能避免一些灾难性的问题。比如说全局变量同名问题(因为一个大的项目是多人完成的,需要导入每个人写的代码汇总);另外,这种代码的编写方式对JS文件的依赖顺序几乎是强制性的,也无法避免全局变量同名问题。

    三、模块化雏形(早期的模块化)

      之前解决上述的问题的方法有匿名函数,类似于(function () {} )()的格式。但是代码的复用性又不得不降低了,甚至不可复用。所以在ES5中可以通过把需要可复用的代码添加到一个对象,通过匿名函数的返回这个对象(使用模块作为出口,暴露到外面的属性和方法,不需要暴露的直接定义),并用某个变量去接收这个返回对象,这个变量就是模块。然后在别的文件导入这个模块,就可以使用这个模块的代码了。

      幸运的是,前端模块化开发以及有了很多既有的规范,以及对应的实现方案。

      常见的模块化规范有:CommonJS(通过node实现),AMD,CMD,也有ES6的Modules。(tips:模块化包括导出和导入)

    四、CommonJS(webpack也使用这个,因为也是依赖node环境)

      CommonJS的导出:(注意是要在node环境下,要用node底层解析module.exports)

    1 module.exports = {
    2     flag: ture,
    3     test(a, b) {
    4         return a + b
    5     },
    6     demo(a, b) {
    7         return a - b
    8     }
    9 }

      CommonJS的导入:(moduleA是刚刚导出文件的文件名(可加路径))

    1 //CommonJS模块
    2 let {test, demo, flag} = require('moduleA')
    3 //等同于
    4 let _mA = require('moduleA');
    5 let test = _mA.test;
    6 let demo = _mA.demo;
    7 let flag = _mA.flag;

    五、ES6的Modules

      export(导出)/import(导入)

      当我们在引入别人JS文件时,用<script src="xxx.js'>,当我们在script标签下使用type=‘module’时,这意味着我们是按照模块化使用这个xxx.js文件。相当于这个文件是在一个模块内,有着自己独立的作用域。

      export(导出了模块对外提供的接口)。可以导出变量,函数,类(ES6提供了class类)。或者是导出一个默认的东西,让导入者自己来命名(export default),这样的好处就是导入者可以不必知道要导入的模块代码的名字。

     1 //info.js
     2 export let name = 'coco'
     3 export let age = 18
     4 //另一种写法
     5 // let name = 'coco'
     6 // let age = 18 
     7 // export {name, age}
     8 export function logInfo (value){
     9     return console.log(value)
    10 } 
    11 export class Person {
    12     constructor(name, age){
    13         this.name = name;
    14         this.age = age;
    15     }
    16     run(){
    17         console.log('I am a class')
    18     }
    19 }
    20 // export logInfo, Person}
    21 //默认导出只能有一个
    22 const address = 'abc';
    23 export default address

      import(导入,加载对应模块)。导入之后就可以对应使用了。通过*可以导入模块中所有的export变量,但是通常情况下我们需要个*用as起一个别名,方便后续使用。

    1 //func.js
    2 import {name, age} from 'info.js'
    3 import{logInfo, Person} from 'info.js'
    4 //默认导出adress并命名为add
    5 import add from 'info.js'
    6 //import * as info from './info'
    7 //console.log(info.name, info.age)

      

  • 相关阅读:
    ICONS-图标库
    图形资源
    vue项目中,如果修改了组件名称,vscode编辑器会在引入修改组件的名字处提示红色波浪线 The file is in the program because:Imported via xxx Root file specified for compilation .
    接口在dev环境报跨域问题(has been blocked by CORS policy:Response to preflight request doesn't pass access control check:No 'Access-Control-Allow-Origin' header ispresent on the requested resource.),qa环境正常
    阿里云occ的图片文件URL用浏览器直接打开无法访问,提示This XML file does noe appear to have any style information associated with it. The document tree is shown below.
    vue 项目使用element ui 中tree组件 check-strictly 用法(父子不互相关联的反显情况)
    高德地图进行线路规划绘制标记点操作(vue)
    vue中实现拖拽调整顺序功能
    2021-01-22 浏览器相关知识
    2021-01-22 js 相关知识点
  • 原文地址:https://www.cnblogs.com/xinkuiwu/p/12040773.html
Copyright © 2011-2022 走看看