esm前端模块化


ESM(ECMA Script Modules)

AMD:
    异步模块定义,我们引用 js文件都是使用 script标签来引用的,这种通常情况下都是异步引用,我们一般在网络中引用文件,引用完之后才能进行解析和运行。我们请求一个模块也是一样,如果这个模块返回的时间不固定,我们只能异步引用的方式,让模块导入之后在开始运行。
    1.Requirejs
  RequireJS是一个javascript文件和模块加载程序,针对浏览器进行了优化,但可以在其他javascript环境中使用,如Rhino和node,可以提高代码的速度和质量
  它可以实现js文件的异步加载,避免网页失去响应,管理模块之间的依赖性,便于代码的编写和维护。
         data-main
     指定网页程序的主模块,data-main申明的文件会被第一个被requireJS加载
          可以创建  main.js->s.js->math.js
           main.js是入口函数,依赖导用 s.js这个模块, s.js的作用是计算图形的面积,而在 math.js中定义了一些数学运算,相当于 s.js这个模块是依赖于 math.js这个模块的,而 math.js是独立于其他模块的,
           <script src="../js/requirejs/require.js" data-main="../js/requirejs/main.js"></script> 定义到了 main.js的入口文件
   require.config()
            可以对模块的加载行为进行自定义,写在主模块的头部,参数就是一个对象,里面有一个重要的属性path,这个属性定义了各个模块的加载路径,还有另一种方法baseUrl,它是直接改变基目录的一种方法
         define()函数
            模块必须使用特定的define函数进行定义,如果一个模块不依赖其他的模块,就可以直接定义在define函数之中,
     2.模块的定义
         1.独立模块
         2.依赖于其他模块的模块
            在 math.js中定义模块的方法,
                define(function(){
                    var PI = 3.14;
                    function multiple(num1,num2){//定义一个乘法,
                        return num1 * num2;
                    }
                    function square(n){//定义平方
                        return Math.pow(n,2);
                    }
                    return {//将数据导出
                        PI : PI,
                        multiple : multiple,
                        square : square
                    }
                })
            在 s.js中定义模块的方法,
                define(['./math'],function(m1){//用中括号定义依赖模块的名字,并且要传入一个参数m1代表这个math模块,如果引用了多个模块,要按照顺序写入对应的参数,
                    function circle(r){//定义一个圆的面积,r代表半径
                        return m1.multiple(m1.PI,m1.square(r));
                    }
                    return{
                        s_circle : circle;//返回这个方法
                    }
                })
            在 main.js中定义模块的方法,
                (function(){//立即执行函数
                    require(['./s],function(s1){//定义依赖s.js的模块,通过参数s1传递
                        console.log(s1.s_circle(10));
                    })
                })()

 

     3.模块的导入 
CommonJS & Webpack
     commonjs在定义模块的时候是使用同步的方式,前端开发的 js比如在引用一个 script的标签的时候是异步的方式,在前端中使用 commonjs需要使用到一些辅助工具,可以使用 webpack来进行 commonjs的模块开发,它其实是一个前端的打包工具,它能将请求的动态资源转换成静态的资源,在这里我们使用 commonjs请求的模块全部打包到一个文件中,以便于我们使用同步的模块请求,先安装 webpack
     1.nodeJS模块的定义。
     2.nodeJS模块的导入。
     3.Webpack 和前端CommonJS.
         main.js的定义方式
            var s = require('./s');
            console.log(s.s_circle(10));
        math.js的定义的方式
            var PI = 3.14;
            function multiple(num1,num2){
                return num1 * num2 ;
            }
            function square(n){
                return Math.pow(n,2);
            }
            module.exports = {
                PI : PI,
                multiple : multiple,
                square : square
            }
         s.js的定义的方式
            var m = require('./math');
            function circle(r){
                return m.multiple(m.PI,m.square(r));
            }
            module.exports = {
                s_circle : circle
            }

 

1.什么是GULP
     1.automate and enhance your workflow 自动化、增强你的工作流
    2.gulp is a toolkit for automating painful or time-consuming tasks in your development workflow,so you can stop messing around and build something
     gulp是一个工具包,可以帮助我们解决开发过程中的痛苦或耗时的任务,避免出现低级错误。
    3.特点
         1.易于使用
        2.构建快速
        3.插件高质
        4.易于学习
2.GULP配置环境
     1.安装nodejs
    2.全局安装gulp-cli
         npm install gulp-cli -g
     3.创建package.json
        在需要使用的环境下  npm init
     4.局部安装gulp
         npm install gulp --save-dev(最好用这个版本,最新版本可能报错 npm install --save-dev gulp@3.9.1);会将安装接入到 package当中,这样我们下次再直接安装这些包的时候, npm install 会将介入进去的包的 package一起下载下来,
     5.创建gulpfile.js
        var gulp = require('gulp');
        gulp.task('default',function(){
            //place default code
        })

 

     6.命令行执行gulp命令
3.GULP基本使用
4.GULP的插件使用与安装

 

gulp的基本使用
     1.开发项目路径,以及构建中需要做的事
         src文件夹是开发时候用的,发布的时候会自动生成 dist文件夹,先建立一个 gulpfile.jsgulp操作的时候是基于任务, gulp定义任务是 gulp.task();
     2.gulp.task();
        创建一个 gulp任务,第一个参数为任务的名称,第二个参数是任务所依赖的其他任务(如果任务没有依赖,可以省略),第三个参数是执行任务所需要的代码
        在 cmd中的作业路径中输入任务的名称测试 gulp copy-index是否成功,
     3.gulp.src();
        需要操作的文件的路径
     4.gulp.dest();
        需要操作的文件复制到目的地的路径。
     5.gulp.watch();
        作用是监听文件的改变,并执行备用的任务
         1.gulp自带watch
         2.gulp-watch
            var gulp = require('gulp');//请求这个模块
            gulp.task('copy-index',function(){//第一个参数copy-index,这里因为是一个独立的任务,没有其他依赖任务,所以是独立的,不需要第二个参数
            gulp.src('./src/index.html')//取到指定的文件。
                .pipe(gulp.dest('./dist'))//pipe是管道的意思,作用是取得pipe之前的文件流作为pipe的参数内函数执行的输入,gulp.dest的作用是将输入的文件流写入到指定的路径下,现在输入的文件流就是src取到的文件流,
            });
            gulp.task('copy-html',function(){
                gulp.src('./src/html/*.html')//*代表html文件下的所有文件
                    .pipe(gulp.dest('./dist/html'))
            });
            gulp.task('copy-vendor',function(){
                gulp.src('./src/vendor/**/*.*')//**代表我要递归的选到所有的文件,*.*代表不管是什么文件
                    .pipe(gulp.dest('./dist/vendor'))
            });
            gulp.task('copy-assets',function(){
                gulp.src('./assets/**/*.*')
                    .pipe(gulp.dest('./dist/assets'))
            });
            //一个命令一个命令是非常繁琐的,可以将这四个命令进行合成,cmd中的相应路径中输入gulp copy就可以了
            gulp('copy',['copy-index','copy-html','copy-vendor','copy-assets']);

 

GULP的插件使用
     1.链接js    (gulp-concat)
        在需要安装的项目路径 cmd npm install gulp-concat,安装完成后,在 fulpfile.js中请求这个模块,在相应的路径中输入 gulp concat,并且在 html中引用 js的时候要写 dist文件夹中的路径,因为那是打包部署的文件,但不要去修改任何 dist中的文件,
              var concat = require('gulp-concat');//请求这个模块 
            
     2.压缩js    (gulp-uglify)
         cmd中安装  npm install gulp-uglify
            var uglify = require('gulp-uglify');//请求这个模块
            gulp.task('concat',function(){
                gulp.src('./src/script/**/*.js')
                    .pipe(concat('output.js'))//链接js,然后设置文件名
                    .pipe(uglify())//将连接之后的文件进行压缩
                    .pipe(gulp.dest('./dist/js'));
            })

 

     3.编译sass  (gulp-sass)
         npm install gulp-sass gulp-minify-css//两个一起安装
          var sass = require('gulp-sass'); 
     4.最小化css (gulp-minify-css)
          var minify = require('gulp-minify-css'); 
     5.文件重命名    (gulp-rename)
        有时候我们需要两份文件,一份未压缩,一份已经压缩,为了避免压缩过的文件覆盖掉为压缩的版本,所以需要重命名。 cmd安装命令 npm install gulp-rename
            gulp.task('sass',function(){
                gulp.src('./src/style/*.scss')
                .pipe(sass())
                .pipe(gulp.dest('./dist/style'))//编译后的文件保存
                .pipe(minify())//压缩
                .pipe(rename(function(filename){//因为源文件有多个,所以需要一个函数去重命名
                    filename.basename += '.min';//basename是表示源文件的名字
                }))
                .pipe(gulp.dest('./dist/style'));
            })

 

     6.监听 gulp.watch
    让 gulp更有效的运行, gulp有一个监听方法,监听任务中监听 sass文件, js文件等等,如果有任何文件发生变化, watch它就会自动实行某项任务
        gulp.task('watch',function(){
            gulp.watch('./src/index.html',['copy-index']);//监听src下的index.html有任何的变化,执行copy-index任务
            gulp.watch('./src/script/**/*.js',['concat']);
            gulp.watch('./src/vendor/**/*.*',['copy-vendor']);
            gulp.watch('./src/html/**/*.html',['copy-vendor']);
            gulp.watch('./assets/**/*.*',['copy-assets']);
            gulp.watch('./src/style/**/*.scss',['sass']);
        })

 

    7.热更新    (gulp-connect)
        当编辑我的代码时,进行了保存以后,我打开的所有相关文档都会得到更新,方便我们测试和开发
        实际上 gulp-cnnnect原本是用来建立服务器的,但也支持热更新
         cmd命令安装 npm install gulp-connect
        var connect = require('gulp-connect');
        gulp.task('server',function(){
            connect.server({//建立一个服务器
                root:'./dist',//建立两个参数,服务器的源地址
                livereload:true//这个服务器自动刷新true
            })
        })
        gulp.watch('./dist/**/*.*',['reload']);//这是gulp.task下的一个方法,监听dist下的所有文件,执行reload任务
        gulp.task('reload',function(){//如果文件有了任何改变,用watch来调用来进行自动的刷新
            gulp.src('./dist/*.html')
            .pipe(connect.reload());//调用方法,
        })
        gulp.task('default',['server','watch'],function(){//可以在cmd中直接输入gulp,这是默认的任务,回调两个任务,而不需要一个一个进行任务的运行
 

        })

 

     8.错误处理  (gulp-plumber)
        如果在后端调式的时候出现错误,会导致 cmdgulp正在运行监听和服务器的任务中断,这时候需要用到错误处理。
         cmd安装命令  npm install gulp-plumber
        var plumber = require('gulp-plumber');//调用gulp-plumber
 //比如在sass任务中加入错误处理
            gulp.task('sass',function(){
                gulp.src('./src/style/*.scss')
                .pipe(plumber())//加入错误处理,这样后台出错的时候,也不会导致监听服务中断
                .pipe(sass())//编译scss
                .pipe(gulp.dest('./dist/style'))
                .pipe(minify())
                .pipe(rename(function(filename){
                    filename.basename += '.min';//basename是表示源文件的名字
                }))
                .pipe(gulp.dest('./dist/style'));
            })

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM