必知的技术知识:esm前端模块化

简介: 必知的技术知识: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是独立于其他模块的,


   定义到了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.js,gulp操作的时候是基于任务,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');


//代码效果参考:http://www.lyjsj.net.cn/wz/art_24163.html

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)


如果在后端调式的时候出现错误,会导致cmd中gulp正在运行监听和服务器的任务中断,这时候需要用到错误处理。


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'));


})

相关文章
|
21天前
|
机器学习/深度学习 人工智能 前端开发
探索未来前端技术发展趋势
随着科技的不断进步,前端技术在不断演进。本文将探索未来前端技术的发展趋势,并讨论其对用户体验、开发效率和安全性的影响。
|
1月前
|
存储 JavaScript 前端开发
使用Vue.js构建交互式前端界面的技术探索
【5月更文挑战第20天】Vue.js是一款渐进式JavaScript框架,擅长构建交互式前端界面。其核心特性包括响应式数据绑定、组件化开发、指令系统和虚拟DOM,简化开发并提升性能。通过Vue CLI创建项目,拆分组件,结合数据绑定和事件处理实现交互,使用Vue Router管理路由,Vuex进行状态管理,能高效构建现代Web应用。
|
1月前
|
资源调度 监控 前端开发
第七章(原理篇) 微前端技术之依赖管理与版本控制
第七章(原理篇) 微前端技术之依赖管理与版本控制
|
16天前
|
缓存 移动开发 前端开发
在PWA的开发中,HTML与CSS作为前端技术的基础,发挥着至关重要的作用
【6月更文挑战第14天】PWA(渐进式网页应用)借助HTML和CSS,提供接近原生应用的体验。HTML构建页面结构和内容,响应式设计适应各种设备,语义化标签提升可访问性,Manifest文件配置应用元数据,离线页面保证无网时体验。CSS则用于定制主题样式,创建动画效果,实现响应式布局,并管理字体和图标。两者协同工作,确保PWA在不同环境下的优秀性能和用户体验。随着前端技术进步,HTML与CSS在PWA中的应用将更加深入。
26 2
|
18天前
|
前端开发 JavaScript Java
【前端技术】 ES6 介绍及常用语法说明
【前端技术】 ES6 介绍及常用语法说明
18 4
|
22天前
|
边缘计算 前端开发 Android开发
未来趋势下的前端开发:跨平台技术的崛起
随着技术的不断演进,前端开发领域也在迅速变化。本文探讨了未来趋势下前端开发的发展方向,着重分析了跨平台技术在前端开发中的崛起,并探讨了其对开发者和行业的影响。
|
3天前
|
编解码 自然语言处理 算法
技术心得:前端学HTTP之字符集
技术心得:前端学HTTP之字符集
|
3天前
|
Web App开发 存储 前端开发
技术心得记录:前端面试题汇总
技术心得记录:前端面试题汇总
|
3天前
|
前端开发 JavaScript 小程序
技术经验解读:你所不知的十二个前端组件库
技术经验解读:你所不知的十二个前端组件库
|
3天前
|
前端开发 安全 NoSQL
技术笔记:Security前端页面配置
技术笔记:Security前端页面配置