barriers / 阅读 / 详情

gulp 怎么编译页面中的es6

2023-06-19 12:23:58
TAG: gulp
共1条回复
wio

gulp在3.9版本里面增加了对babel的支持,因此我们可以直接在gulpfile里面使用ES6(ES2015)了。

升级gulp版本

首先要检测一下我们的gulp版本,确保CLI版本及Local版本都在3.9之上:

gulp -v

版本如下:

CLI version 3.9.0

Local version 3.9.0

若版本过低,我们可以通过以下方式进行升级,这里将同时升级CLI版本和Local版本:

npm install gulp -g && npm install gulp --save-dev

安装babel

我们需要安装babel-core及babel-preset-es2015来转换ES6代码:

npm install babel-core babel-preset-es2015 --save-dev

然后,创建一个.babelrc文件来使用es2015 preset:

touch .babelrc

写入如下内容:

{

"presets": ["es2015"]

}

接下来就是使用ES6语法重写gulpfile了。

使用ES6语法重写gulpfile

首先,重命名gulpfile.js为gulpfile.babel.js,这样gulp执行前会自动调用babel转换文件。

mv gulpfile.js gulpfile.babel.js

然后在gulpfile.babel.js里面用ES6语法写些内容,如下:

"use strict";

import gulp from "gulp";

import less from "gulp-less";

const paths = {

less: "less/",

dest: "build/"

};

gulp.task("less", () => {

gulp.src(`${paths.less}**/*.less`)

.pipe(less())

.pipe(gulp.dest(`${paths.dest}css/`));

});

然后执行gulp命令:

gulp less

这里和原来一样,以前的命令怎么用现在还是怎么用!

GitHub源码:using-es6-with-gulp

相关推荐

gulp 怎样实现页面的路径替换

比较好的解决法是,首先创建package.json文件,然后显示`npminstallgulp--save-dev`,这样会把gulp安装到当前目录下node_modules目录下。同时一个gulp的executable会被安装到./node_modules/.bin下。此时你执行。./node_modules/.bin/gulp即可。这种方法比全局安装要好,因为用到的gulp的版本只和当前项目相关。如果觉得每次输入./node_modules/gulp复杂,那么你在package.json中得scripts段落添加诸如{"build":"gulp"},然后每次在工程目录执行npmbuild即可。npm运行脚本时,会自动到./node_modules/.bin下查找对应的可执行文件。
2023-06-19 11:08:321

gulp怎么压缩html js css 混合的文件

合并和压缩JS、CSS文件压缩JS,CSS文件需要引用如下组件:gulp-minify-css: 压缩cssgulp-jshint: 检查jsgulp-uglify: 压缩jsgulp-concat: 合并文件gulp-rename: 重命名文件gulp-clean: 清空文件夹gulp-notify:提示安装组件项目目录,通过cd 进入项目的根目录,执行下边的npm安装组件npm install gulp-minify-css gulp-jshint gulp-uglify gulp-rename gulp-concat gulp-clean gulp-notify --save-dev
2023-06-19 11:09:011

gulp执行任务的速度很慢 怎么优化

1、在任务管理器中(ctrl+alt+delete),选性能,看卡住的时候哪些程序内存占用过多,cpu使用率过高,内存过多的话,上网查一下是什么进程,可结束的就结束程序。cpu过高,可试试换操作系统。还可在事件查看器中看系统经常报什么错,看能否找出问题。  2、W7系统,可下载W7优化大师,优化一下。W8系统有W8优化大师,XP有优化大师。  3、W7、W8:开始-运行(输入msconfig)-回车-引导---高级选项---勾选"处理器个数",选择最大核心数--勾选"最大内存"--确定。回到系统配置窗口-启动,保留杀毒软件和输入法,其它的全部禁用。  4、用金山或者360卫士,在优化系统中打开开机加速,关闭一些你不需要开机启动的进程。  5、进行磁盘碎片整理和磁盘清理。注意:W7不能压缩C盘来增大空间,否则无法启动。
2023-06-19 11:09:251

gulp-usemin怎么处理多个html文件

gulp-usemin处理多个html文件的方法:1、在gulp.src目录下定义要处理的css、html和js文件:2、在gulp.task中注入多个需要处理的html文件就可以。完整代码如下:function build(path){ return gulp.src([path]) .pipe(plugins.usemin({ css: [plugins.minifyCss({keepSpecialComments: false}), "concat"], html: [plugins.minifyHtml({empty: true})], js: [plugins.uglify({ mangle: false, compress: false, beautify: true }), plugins.rev()] })) .pipe(gulp.dest(paths.server));}//注册处理总调度任务gulp.task("build-html", function (cb) { plugins.sequence("build-master", "build-slave", cb);});// 处理index.htmlgulp.task("build-master", function () { return build("index.html")});// 处理slave.htmlgulp.task("build-master", function () { return build("slave.html")});
2023-06-19 11:09:391

为什么安装gulp的时候总是提示 Local gulp not found in

解决方法: 第1步:先cd到当前目录中,如果是webstorm打开Terminal默认就是当前项目,使用以下命令,回车即可:npm link gulp 第2步:配置node相关的环境变量,即node_modules的安装目录:使用以下命令:npm root -g 获得安装路径,然后 vim ~/.bash_profile 添加两行: NODE_PATH=/usr/local/lib/node_modules export NODE_PATH
2023-06-19 11:09:481

如何使用gulp来编译coffeescript

原理.coffee是coffeescript的文件后缀,通过coffee的编译器,可以把它编译成js示例Gulpfile.js里安装模块var coffee = require("gulp-coffee");var coffeelint = require("gulp-coffeelint");配置校验和编译//////////////////// CoffeeScript ////////////////////gulp.task("validate_coffee", function () { gulp.src(coffeescript_files) .pipe(coffeelint()) .pipe(coffeelint.reporter());});gulp.task("compile_coffee", ["validate_coffee"], function() { gulp.src(coffeescript_files) .pipe(cache("coffee")) .pipe(coffee({bare: true}).on("error", gutil.log)) .pipe(gulp.dest(build_dir));});说明:validate_coffee是用于校验coffee语法的taskcompile_coffee是编译coffee脚本为js的task,它依赖于validate_coffee,即在执行compile之前必须先校验-----------------------------------如有疑问欢迎追问!满意请点击右上方【选为满意回答】按钮
2023-06-19 11:10:001

gulp devour的difference

gulp可以作为名词:I took in a large gulp of air.devour只能作为动词:The scourge will devour all.
2023-06-19 11:10:101

gulp版本自动化文件中路径含有变量(绝对路径)怎么处理

你这是问的什么问题 ?
2023-06-19 11:10:222

stuff与 gulp的区别?都有狼吞虎咽的意思哦???怎么区分?

stuff是塞(满肚子),gulp则注重一大口一大口的吃
2023-06-19 11:10:522

gulp压缩合并css/js时,怎么自动修改引用压缩后的css/js的路径

记录一下用 gulp 来合并、压缩CSS以及进行 MD5命名以及替换文件中引入的CSS文件,当然这一系列操作都是用基于gulp插件的,主要会用到下面的几个插件:var concat = require("gulp-concat");//- 多个文件合并为一个;var minifyCss = require("gulp-minify-css");//- 压缩CSS为一行; var rev = require("gulp-rev");//- 对文件名加MD5后缀var revCollector = require("gulp-rev-collector");//- 路径替换安装Gulp插件到本地项目npm init//- 生成一个 package.json,里面是一些常规的配置信息npm install gulp gulp-concat gulp-minify-css gulp-rev gulp-rev-collector --save-dev//- 安装插件到项目目录内完成上面两步后,会在我们的项目内生成一个package.json文件以及一个node_modules目录创建配置文件 gulpfile.js在项目根目录内创建一个 gulpfile.js 文件(必须是这个文件名哟~),内容就是上面几个插件的配置信息:var gulp = require("gulp");var concat = require("gulp-concat"); //- 多个文件合并为一个;var minifyCss = require("gulp-minify-css"); //- 压缩CSS为一行;var rev = require("gulp-rev"); //- 对文件名加MD5后缀var revCollector = require("gulp-rev-collector"); //- 路径替换gulp.task("concat", function() { //- 创建一个名为 concat 的 taskgulp.src(["./css/wap_v3.1.css", "./css/wap_v3.1.3.css"]) //- 需要处理的css文件,放到一个字符串数组里.pipe(concat("wap.min.css")) //- 合并后的文件名.pipe(minifyCss()) //- 压缩处理成一行.pipe(rev()) //- 文件名加MD5后缀.pipe(gulp.dest("./css")) //- 输出文件本地.pipe(rev.manifest()) //- 生成一个rev-manifest.json.pipe(gulp.dest("./rev")); //- 将 rev-manifest.json 保存到 rev 目录内});gulp.task("rev", function() {gulp.src(["./rev/*.json", "./application/**/header.php"]) //- 读取 rev-manifest.json 文件以及需要进行css名替换的文件.pipe(revCollector()) //- 执行文件内css名的替换.pipe(gulp.dest("./application/")); //- 替换后的文件输出的目录});gulp.task("default", ["concat", "rev"]);运行结果通过以上的配置之后,就可以开始运行 gulp 对我们的项目进行相关的操作啦;使用 gulp 命令,运行Gulp.js 构建程序首先运行 concat 这个 task 生成一个 rev-manifest.json 文件然后再运行 rev 这个 task 替换掉文件中引入的 cssYuanWingdeMacBook-Pro:m YuanWing$ gulp concat[11:47:02] Using gulpfile ~/SVN/JKD/m/gulpfile.js[11:47:03] Starting "concat"...[11:47:03] Finished "concat" after 12 msYuanWingdeMacBook-Pro:m YuanWing$ gulp rev[11:47:17] Using gulpfile ~/SVN/JKD/m/gulpfile.js[11:47:17] Starting "rev"...[11:47:17] Finished "rev" after 10 msYuanWingdeMacBook-Pro:m YuanWing$ rev-manifest.json文件内容:{ "wap.min.css": "wap.min-c49f62a273.css"}header.php替换前后对比:替换前:<link rel="stylesheet" href="/css/wap.min.css" />替换后:<link rel="stylesheet" href="/css/wap.min-c49f62a273.css" />gulp-rev-collector进行文件路径替换是依据 rev-manifest.json 的,所以要先成生 .json 文件,然后再进行替换;
2023-06-19 11:11:011

It only works if I gulp on my tiptoes. 这句英语;on是介词还是副词?

在这个句子中,on是介词。
2023-06-19 11:11:185

执行gulp命令报错,怎么办

uglify解析时出错了,看下问题出在哪儿.pipe(uglify().on("error", function(e) {console.log(e);})
2023-06-19 11:11:411

为什么安装gulp的时候总是提示 Local gulp not found in

  比较好的解决办法是,首先创建 package.json 文件,然后显示`npm install gulp --save-dev`,这样会把 gulp 安装到当前目录下 node_modules 目录下。同时一个 gulp 的 executable 会被安装到 ./node_modules/.bin 下。此时你执行 。./node_modules/.bin/gulp 即可。这种方法比全局安装要好,因为用到的 gulp 的版本只和当前项目相关。如果觉得每次输入 ./node_modules/gulp 复杂,那么你在 package.json 中得 scripts 段落添加诸如 {"build": "gulp" },然后每次在工程目录执行 npm build 即可。npm 运行脚本时,会自动到 ./node_modules/.bin 下查找对应的可执行文件。
2023-06-19 11:12:001

gulp执行压缩时很慢怎么实现

1、在任务管理器中(ctrl+alt+delete),选性能,看卡住的时候哪些程序内存占用过多,cpu使用率过高,内存过多的话,上网查一下是什么进程,可结束的就结束程序。cpu过高,可试试换操作系统。还可在事件查看器中看系统经常报什么错,看能否找出问题。  2、W7系统,可下载W7优化大师,优化一下。W8系统有W8优化大师,XP有优化大师。  3、W7、W8:开始-运行(输入msconfig)-回车-引导---高级选项---勾选"处理器个数",选择最大核心数--勾选"最大内存"--确定。回到系统配置窗口-启动,保留杀毒软件和输入法,其它的全部禁用。  4、用金山或者360卫士,在优化系统中打开开机加速,关闭一些你不需要开机启动的进程。  5、进行磁盘碎片整理和磁盘清理。注意:W7不能压缩C盘来增大空间,否则无法启动。
2023-06-19 11:12:091

为什么我使用gulp-babel不能将es6编译成es5

需要安装babel-preset-es2015插件,才能把es6编译成es5npm install --save-dev babel-preset-es2015在gulpfile.js中增加presets var gulp = require("gulp");var babel = require("gulp-babel");gulp.task("default", function () {return gulp.src("src/app.js").pipe(babel({presets: ["es2015"]})).pipe(gulp.dest("dist"));});
2023-06-19 11:12:281

为什么安装gulp的时候总是提示 Local gulp not found in

解决方法:第1步:先cd到当前目录中,如果是webstorm打开Terminal默认就是当前项目,使用以下命令,回车即可:npmlinkgulp第2步:配置node相关的环境变量,即node_modules的安装目录:使用以下命令:npmroot-g获得安装路径,然后vim~/.
2023-06-19 11:12:371

为什么安装gulp的时候总是提示 Local gulp not found in

需要不带 -g 安装到项目路径:1npm install gulp
2023-06-19 11:13:091

gulp压缩合并css/js时,怎么自动修改引用压缩后的css/js的路径

知道怎么做了吗?可否告知一下
2023-06-19 11:13:242

为什么修改代码之后 gulp build就会恢复到没修改之前的代码呢

这个原因可能是因为这个school.css是由css预处理器编译出来的,你看看是不是有叫school.less或者school.scss这种类似的文件,去修改这里面对应的图片路径,不然你只修改css文件是没用的,编译后会被覆盖掉
2023-06-19 11:13:451

gulp压缩合并css/js时,怎么自动修改引用压缩后的css/js的路径

css文件压缩用gulp-minify,js多个文件合并好像是gulp-concat然后再将其压缩用gulp-uglify
2023-06-19 11:13:521

gulp-rev-collector 怎么替换不了html中js

你需要结合gulp-rev使用的。然后根据npm上的文档,看看具体使用方法吧。这里只说一下大概过程,gulp-rev会产生一个json文件,对应rev前后的名称,然后再通过gulp-rev-collector把要替换资源的html和这个json作为参数传入,然后就可以达到目的完成资源替换了。
2023-06-19 11:13:591

为什么安装gulp的时候总是提示 Local gulp not found in

stlessly from side to side, seeking for the
2023-06-19 11:14:181

在cmd窗口下输入gulp watch,这条命令是干什么用的?什么意思?

所在目录下是不是有个gulpfile.js的文件 里面是不是有这个方法gulp.task("watch", function () {});执行的是这个
2023-06-19 11:14:351

前端开发中提到的“脚手架”到底指什么,CLI

脚手架是指输入简单的指令就可以完成基本环境搭建的工具(减少重复代码的工具),比如gulp是任务自动构建工具,gulp-cli则是以命令行的形式安装和操作gulp的工具。gulp和gulp-cli的区别(http://stackoverflow.com/questions/35571679/what-does-gulp-cli-stands-for)有详细的介绍。
2023-06-19 11:14:441

贝克力400倍诱鱼好用吗

好用。1、贝克力400倍诱鱼,气味能够400倍快速扩散,能够快速的引诱鱼儿上钩,以及更大范围的引鱼儿上钩。2、贝克力GULP是一种能与淡海水兼容的强效诱鱼剂,它是一种水性的聚合物质,通过水的逐渐渗入及不断流动,能够快速的在水中散播开来。
2023-06-19 11:14:521

前端开发需要掌握的经验?

提高程序员的工作经验除了通过项目实际开发以外,只有平时的知识积累以及简单的程序开发测验等项目来提高了。今天,我们就一起来了解一下,在提高开发工程师操作经验的时候,都有哪些方面是需要掌握的。在此之前,如果你需要使用一些外部的库或者任何插件,你都需要手动下载相应的JavaScript和CSS文件,然后把它们放进项目中。但是如果这些库或者插件发布新版本的话,你也得在项目中做出相应的更新,这样管理项目是非常麻烦的。包管理器帮助你解决了这个麻烦,它们可以帮助你自动地将外部库和插件引入到项目中,这样你就不必专门手动更新外部文件了。包管理器有yarn和npm,两者几乎相同,都只有安装的功能。你可以选择其中的任何一个,一旦学会使用其中的一个,另一个也就会了。让我们学以致用当你对包管理器有了基本的了解之后,就可以在你制作的网页中引入一些外部库。例如你可以安装一些Toast插件,当用户点击按钮的时候,用Toast插件向他们显示信息;或者你可以创建一个登陆表单,利用一些表单验证库来进行表单验证。可以学习如何使用不同的库,并了解如何安装不同的版本。CSS预处理器预处理器让CSS的功能更加丰富。CSS预处理器有Sass,Less,Stylus等等。如果让我选择的话,我喜欢Sass。近比较流行的CSS预处理器是PostCSS,它的作用相当于CSS的解析器,了解它的使用也是很不错的。它可以单独使用,也可以配合Sass使用。我的建议是先学会Sass,后面如果你有时间的话可以再研究PostCSS.CSS框架你不需要再学习CSS框架,当然如果你想学习的话,也有很多选择。我喜欢的CSS框架是Bootstrap、Materialize和Bulma。但是结合现在的市场需求来说,我会选择Bootstrap。CSS文件管理随着项目的复杂程度增加,CSS也会开始变得混乱而无法维护。我们也有很多方式可以更好地构建CSS,以实现可伸缩性。例如OOCSS、SMACSS、SUITCSS、Atomic和BEM。你可以了解下它们之间的不同,我个人更喜欢BEM。构建工具构建工具可以帮助你构建、打包和开发JavaScript应用程序。这里包括校验工具、自动化构建工具及打包工具。自动化构建工具有npm、gulp、grunt等。但是现在Webpack已经能够实现Gulp的很多功能,所以,现在通常都只使用npm来配合webpack完成任务自动化。你不必学习Gulp,当然以后如果你有时间的话,也可以了解一下,看看它是否适用于你的项目。校验工具有ESLint、JSLint、JSHint和JSCS,但是目前大部分人都使用ESLint。打包工具有Parcel、Webpack、Rollup、Browserify等等。如果必须选择一个的话,请毫不犹豫地选择Webpack。Rollup也很常用,但是北大青鸟昌平计算机学院建议将它用在库里面。在开发app的时候,请使用Webpack。所以,现在请开始自学Webpack,如果你愿意的话,了解一下Rollup也可以。
2023-06-19 11:14:591

前端开发需要掌握的经验?

提高程序员的工作经验除了通过项目实际开发以外,只有平时的知识积累以及简单的程序开发测验等项目来提高了。今天,我们就一起来了解一下,在提高开发工程师操作经验的时候,都有哪些方面是需要掌握的。在此之前,如果你需要使用一些外部的库或者任何插件,你都需要手动下载相应的JavaScript和CSS文件,然后把它们放进项目中。但是如果这些库或者插件发布新版本的话,你也得在项目中做出相应的更新,这样管理项目是非常麻烦的。包管理器帮助你解决了这个麻烦,它们可以帮助你自动地将外部库和插件引入到项目中,这样你就不必专门手动更新外部文件了。包管理器有yarn和npm,两者几乎相同,都只有安装的功能。你可以选择其中的任何一个,一旦学会使用其中的一个,另一个也就会了。让我们学以致用当你对包管理器有了基本的了解之后,就可以在你制作的网页中引入一些外部库。例如你可以安装一些Toast插件,当用户点击按钮的时候,用Toast插件向他们显示信息;或者你可以创建一个登陆表单,利用一些表单验证库来进行表单验证。可以学习如何使用不同的库,并了解如何安装不同的版本。CSS预处理器预处理器让CSS的功能更加丰富。CSS预处理器有Sass,Less,Stylus等等。如果让我选择的话,我喜欢Sass。近比较流行的CSS预处理器是PostCSS,它的作用相当于CSS的解析器,了解它的使用也是很不错的。它可以单独使用,也可以配合Sass使用。我的建议是先学会Sass,后面如果你有时间的话可以再研究PostCSS.CSS框架你不需要再学习CSS框架,当然如果你想学习的话,也有很多选择。我喜欢的CSS框架是Bootstrap、Materialize和Bulma。但是结合现在的市场需求来说,我会选择Bootstrap。CSS文件管理随着项目的复杂程度增加,CSS也会开始变得混乱而无法维护。我们也有很多方式可以更好地构建CSS,以实现可伸缩性。例如OOCSS、SMACSS、SUITCSS、Atomic和BEM。你可以了解下它们之间的不同,我个人更喜欢BEM。构建工具构建工具可以帮助你构建、打包和开发JavaScript应用程序。这里包括校验工具、自动化构建工具及打包工具。自动化构建工具有npm、gulp、grunt等。但是现在Webpack已经能够实现Gulp的很多功能,所以,现在通常都只使用npm来配合webpack完成任务自动化。你不必学习Gulp,当然以后如果你有时间的话,也可以了解一下,看看它是否适用于你的项目。校验工具有ESLint、JSLint、JSHint和JSCS,但是目前大部分人都使用ESLint。打包工具有Parcel、Webpack、Rollup、Browserify等等。如果必须选择一个的话,请毫不犹豫地选择Webpack。Rollup也很常用,但是北大青鸟昌平计算机学院建议将它用在库里面。在开发app的时候,请使用Webpack。所以,现在请开始自学Webpack,如果你愿意的话,了解一下Rollup也可以。
2023-06-19 11:15:061

安东尼·蒂诺佐的人物小传

家世:Tony生于1968年,是纽约长岛一个富裕家庭的独子,却无心继承家里的财产。他的母亲在他八岁时去世,而他的父亲安东尼 迪诺佐 一世则沾花惹草麻烦不断。学历及工作经历:Tony在少年时期进入罗德岛军校就读,并且在俄亥俄州州立大学取得了艺术及体育学士学位,在大学时期是大学生篮球代表队成员。他是大学兄弟会的成员,并且至今都和同学们保持着很好的关系。在child play里面,他提到过他的SAT分数是950分。他曾在皮若亚、费城、巴尔的摩警察局分别工作过两年,他在巴尔的摩工作时认识了Gibbs并且接受了NCIS的工作邀请。在NCIS工作时,Tony接受了Jenny交给他的任务而卧底与军火商Rene Benoit的女儿交往,Jenny去世后tony被调往罗纳德里根号航空母舰,在调遣命令到期后,他才回到NCIS总部。
2023-06-19 11:08:541

Floria这个英文名怎么样?

its a good name. not many people have it. meaning is nice too, blossoming flower. another good name i like is Noelle, its french, meaning christmas.
2023-06-19 11:08:571

好听的宠物英文名

cloris是古希腊神话里花的女神,指盛开的花朵。 brinkley是这个名字的代表人物,可爱,年轻,善良的金发女孩,风趣并受欢迎。 connie是constance的简写,在人们心目中的constance有两种:体态优美,娇小美丽的女人,活泼,有点糊涂且受欢迎或是高挑勤奋的保守女子。 daisy (老式英语)"雏菊"。森林来的"金发女孩",甜美可爱。 ella (古式英语),"小淘气,美丽的女子"。人们说ella是高大,魁梧的女黑人-一个保守的祖母,快乐,讨喜,友善。 francis(拉丁)"自由,来自法国;francis的女性名。大部份的人认为francis是个纤弱保守的女子,善良,可爱但沉稳。 judy为judith的简写。 judy被视为喜欢捉弄人的小精灵,骄小,可爱,非常和善。katrina纯洁的意思。 laura拉丁名,意为『海湾之树』。事实上是lawrence的女性形式。人们说laura是美丽的金发蓝眸女子,古典气质,性格甜美。 tracy(爱尔兰)作战者;(拉丁)有勇气的,resa的简称。tracy被描绘为可爱喜欢运动的有著卷曲金发女人,有自信的掌事者,喜欢寻找乐趣,有良好的教养个性温和。 vivian源为拉丁字vivianus,意为有活力的。充满活力?可不是吗!人们说vivian是活力四射,有教养,风趣,友善,又好动
2023-06-19 11:09:112

芙罗兰产品质量怎么样?

法国牌子???呵呵。。法国人知道吗??都是广州货,你懂吗?牌子是商标注册的。你晓得吗?呵呵。。10毫升,就一百大洋。。呵呵。。黄金现在才300元以内了。。都。。
2023-06-19 11:09:112

翻译并填空符合题意就行了

sad;overcome;work; feeling;live;after;about
2023-06-19 11:09:132

BenoitDidier主要经历

BenoitDidierBenoitDidier,主要作品《太阳底下》。外文名:BenoitDidier职业:演员代表作品:《太阳底下》合作人物:EricSummer电视剧作品
2023-06-19 11:09:181

Android 重学系列 ion驱动源码浅析

上一篇文章,在解析初始化GraphicBuffer中,遇到一个ion驱动,对图元进行管理。首先看看ion是怎么使用的: 我们按照这个流程分析ion的源码。 如果对ion使用感兴趣,可以去这篇文章下面看 https://blog.csdn.net/hexiaolong2009/article/details/102596744 本文基于Android的Linux内核版本3.1.8 遇到什么问题欢迎来本文讨论 https://www.jianshu.com/p/5fe57566691f 什么是ion?如果是音视频,Camera的工程师会对这个驱动比较熟悉。最早的GPU和其他驱动协作申请一块内存进行绘制是使用比较粗暴的共享内存。在Android系统中使用的是匿名内存。最早由三星实现了一个Display和Camera共享内存的问题,曾经在Linux社区掀起过一段时间。之后各路大牛不断的改进之下,就成为了dma_buf驱动。并在 Linux-3.3 主线版本合入主线。现在已经广泛的运用到各大多媒体开发中。 首先介绍dma_buf的2个角色,importer和exporter。importer是dma_buf驱动中的图元消费者,exporter是dma_buf驱动中的图元生产者。 这里借用大佬的图片: ion是基于dma_buf设计完成的。经过阅读源码,其实不少思路和Android的匿名内存有点相似。阅读本文之前就算不知道dma_buf的设计思想也没关系,我不会仔细到每一行,我会注重其在gralloc服务中的申请流程,看看ion是如何管理共享内存,为什么要抛弃ashmem。 我们先来看看ion的file_operation: 只有一个open和ioctl函数。但是没有mmap映射。因此mmap映射的时候一定其他对象在工作。 我们关注显卡英伟达的初始化模块。 文件:/ drivers / staging / android / ion / tegra / tegra_ion.c module_platform_driver实际上就是我之前经常提到过的module_init的一个宏,多了一个register注册到对应名字的平台中的步骤。在这里面注册了一个probe方法指针,probe指向的tegra_ion_probe是加载内核模块注册的时候调用。 先来看看对应的结构体: 再来看看对应ion内的堆结构体: 完成的事情如下几个步骤: 我们不关注debug模式。其实整个就是我们分析了很多次的方法。把这个对象注册miscdevice中。等到insmod就会把整个整个内核模块从dev_t的map中关联出来。 我们来看看这个驱动结构体: 文件:/ drivers / staging / android / ion / ion_heap.c 这里有四个不同堆会申请出来,我们主要来看看默认的ION_HEAP_TYPE_SYSTEM对应的heap流程。 其实真正象征ion的内存堆是下面这个结构体 不管原来的那个heap,会新建3个ion_system_heap,分别order为8,4,0,大于4为大内存。意思就是这个heap中持有一个ion_page_pool 页资源池子,里面只有对应order的2的次幂,内存块。其实就和伙伴系统有点相似。 还会设置flag为ION_HEAP_FLAG_DEFER_FREE,这个标志位后面会用到。 文件:/ drivers / staging / android / ion / ion_page_pool.c 在pool中分为2个链表一个是high_items,另一个是low_items。他们之间的区分在此时就是以2为底4的次幂为分界线。 文件:/ drivers / staging / android / ion / ion.c 因为打开了标志位ION_HEAP_FLAG_DEFER_FREE和heap存在shrink方法。因此会初始化两个回收函数。 文件:/ drivers / staging / android / ion / ion_heap.c 此时会创建一个内核线程,调用ion_heap_deferred_free内核不断的循环处理。不过由于这个线程设置的是SCHED_IDLE,这是最低等级的时间片轮转抢占。和Handler那个adle一样的处理规则,就是闲时处理。 在这个循环中,不断的循环销毁处理heap的free_list里面已经没有用的ion_buffer缓冲对象。 文件:/ drivers / staging / android / ion / ion_system_heap.c 注册了heap的销毁内存的方法。当系统需要销毁页的时候,就会调用通过register_shrinker注册进来的函数。 文件:/ drivers / staging / android / ion / ion_page_pool.c 整个流程很简单,其实就是遍历循环需要销毁的页面数量,接着如果是8的次幂就是移除high_items中的page缓存。4和0则销毁low_items中的page缓存。至于为什么是2的次幂其实很简单,为了销毁和申请简单。__free_pages能够整页的销毁。 文件:/ drivers / staging / android / ion / ion.c 主要就是初始化ion_client各个参数,最后把ion_client插入到ion_device的clients。来看看ion_client结构体: 核心还是调用ion_alloc申请一个ion缓冲区的句柄。最后把数据拷贝会用户空间。 这个实际上就是找到最小能承载的大小,去申请内存。如果8kb申请内存,就会拆分积分在0-4kb,4kb-16kb,16kb-128kb区间找。刚好dma也是在128kb之内才能申请。超过这个数字就禁止申请。8kb就会拆成2个4kb保存在第一个pool中。 最后所有的申请的page都添加到pages集合中。 文件:/ drivers / staging / android / ion / ion_page_pool.c 能看到此时会从 ion_page_pool冲取出对应大小区域的空闲页返回上层,如果最早的时候没有则会调用ion_page_pool_alloc_pages申请一个新的page。由于引用最终来自ion_page_pool中,因此之后申请之后还是在ion_page_pool中。 这里的处理就是为了避免DMA直接内存造成的缓存差异(一般的申请,默认会带一个DMA标志位)。换句话说,是否打开cache其实就是,关闭了则使用pool的cache,打开了则不使用pool缓存,只依赖DMA的缓存。 我们可以看另一个dma的heap,它是怎么做到dma内存的一致性. 文件: drivers / staging / android / ion / ion_cma_heap.c 能看到它为了能办到dma缓存的一致性,使用了dma_alloc_coherent创建了一个所有强制同步的地址,也就是没有DMA缓存的地址。 这里出现了几个新的结构体,sg_table和scatterlist 文件:/ lib / scatterlist.c 这里面实际上做的事情就是一件:初始化sg_table. sg_table中有一个核心的对象scatterlist链表。如果pages申请的对象数量<PAGE_SIZE/sizeof(scatterlist),每一项sg_table只有一个scatterlist。但是超出这个数字就会增加一个scatterlist。 用公式来说: 换句话说,每一次生成scatterlist的链表就会直接尽可能占满一页,让内存更好管理。 返回了sg_table。 初始化ion_handle,并且记录对应的ion_client是当前打开文件的进程,并且设置ion_buffer到handle中。使得句柄能够和buffer关联起来。 每当ion_buffer需要销毁,
2023-06-19 11:09:201

BenoitSt-Hilaire人物简介

BenoitSt-Hilaire外文名:BenoitSt-Hilaire职业:演员代表作品:《哇喔》合作人物:MichelBerthiaume电视剧作品
2023-06-19 11:09:241

华为MA5616的产品特点

接入密度高:最大支持256路POTS用户,或128路ADSL2+用户,或192路VDSL2,或64路FE用户。采用COMBO板可同时提供128路POTS+128路ADSL2+; 业务灵活配比:支持各种业务板任意混插,各种端口数量配比灵活,提高实装率,满足不同的客户需求; 支持COMBO板(4GE+4FE),可有效提高接入密度,节省机房空间,并减少线缆走线复杂度; 支持P2P光接入板,可为高价值客户提供大带宽接入; 支持48V蓄电池备电,既支持铅酸蓄电池,又支持铁锂蓄电池; 可运营的IPTV业务:强大的业务交换容量、系统包转发率以及高集成度(数据交换和用户管理),使其具有了电信级的组播运营能力; 完善的语音特性:支持语音业务、传真业务和Modem业务等基本业务,三方通话、呼叫等待、呼叫转移、主叫号码显示、主叫号码限制等补充业务; 即插即用的业务发放模式:支持远程配置下发,设备上电注册成功之后即可建立管理通道和业务通道,无需人工现场配置,即插即用; 高效的管理维护模式:支持免现场软调、远程验收、远程升级打补丁、远程故障定位等多种高效的管理维护方法; 可靠性高:可工作于最低-40℃或者最高65℃工作温度,6KV的高防雷能力,降低雷击故障率;单板防腐蚀设计,延长设备使用寿命; 周密的安全措施:适应电信业务的安全性要求,对安全性方面的协议进行了深入研究和应用,充分保障系统安全和用户接入安全; 绿色节能:选用高效能电源,降低系统能耗;风扇智能调速,有效降低闲时能耗;采用高性能套片,降低芯片能耗;支持POTS短环路设计,有效降低短距离下端口功耗; 面向未来的架构设计:未来根据运营商的组网和业务需求,可以提供相应的线路板卡来解决,系统不做其它改动,快速响应。 MA5616产品特性: 特性CCUB主控板CCUC主控板  GPON特性遵循ITU G.984系列标准 遵循ITU G.984系列标准T-CONT的数量:8个 T-CONT的数量:32个GEM Port的数量:128个 GEM Port的数量:1000个EPON特性满足IEEE802.3ah标准,满足CTC2.1标准 满足IEEE802.3ah标准,满足CTC2.1标准 支持动态带宽分配(DBA)支持动态带宽分配(DBA)宽带特性VLAN数量:4K,支持QinQ 和Stacking VLANVLAN数量:4K,支持QinQ 和Stacking VLANMAC地址数量:4K,支持VMAC功能MAC地址数量:4K,支持VMAC功能支持VLAN切换支持VLAN切换支持PPPOA转PPPOE,支持IPOA转IPOE支持PPPOA转PPPOE,支持IPOA转IPOE支持802.1p,支持PQ与WRR流控,支持ACL支持802.1p,支持PQ与WRR流控,支持ACL语音特性支持SIP,支持H.248支持SIP,支持H.248支持ISDN BRA接口支持ISDN BRA接口支持POTS短环路设计,有效降低功耗支持POTS短环路设计,有效降低功耗ADSL2+特性满足G992.1~G992.5、T1.413标准满足G992.1~G992.5、T1.413标准支持Annex M支持Annex M支持ADSL2+ bonding(2/4/6/8线对)支持ADSL2+ bonding(2/4/6/8线对)VDSL2特性满足G993.2标准满足G993.2标准支持8a/8b/8c/8d/12a/12b/17a/30a支持8a/8b/8c/8d/12a/12b/17a/30a支持2线对VDSL2 bonding支持2线对VDSL2 bondingSHDSL特性满足G991.2标准满足G991.2标准支持G.SHDSL.Bis,支持ATM/PTM模式支持G.SHDSL.Bis,支持ATM/PTM模式支持EFM bonding(2/4/6/8线对)支持EFM bonding(2/4/6/8线对)组播特性支持IGMP V2/V3支持IGMP V2/V3支持IGMP Proxy和Snooping支持IGMP Proxy和Snooping系统可配的组播节目数:1024支持组播用户数量:256 每用户最大并发组播数量:16系统可配的组播节目数:1024支持组播用户数量:256每用户最大并发组播数量:16 安全特性支持PPPoE+和DHCP Option82支持PPPoE+和DHCP Option82支持MAC地址静态及动态绑定支持MAC地址静态及动态绑定支持防御MAC/IP Spoofing,支持源MAC/IP过滤支持防御MAC/IP Spoofing,支持源MAC/IP过滤支持防DOS攻击,支持防火墙功能支持防DOS攻击,支持防火墙功能维护管理特性支持SNMP v1/v2/v3支持SNMP v1/v2/v3支持Telnet,支持SSHv2支持Telnet,支持SSHv2支持远程批量预部署功能支持远程批量预部署功能支持远程升级和远程监控支持远程升级和远程监控   MA5616控制及业务处理板描述 简称 全称 功能简介 CCUB 中央控制单元板 主要完成上行业务汇聚,设备管理及对各个接口模块的业务管理等功能。支持热插拔。 业务板描述   简称 全称 功能简介   ASRB 32路窄带用户板 支持VoIP业务,提供POTS用户接入。支持热插拔。   ASPB 64路窄带用户板 支持VoIP业务,提供POTS用户接入。支持热插拔。   DSLD 8路ISDN业务板 支持8路ISDN接入,4路ISDN接口可以接1个基站,1块DSLD可以接2个基站。支持热插拔。   ADLE 32路ADSL2+业务板 支持32路ADSL2+ over POTS接入,内置分离器。支持热插拔。   VDGE 16路VDSL2 over POTS业务板 支持16路VDSL2 over POTS接入,支持线路保护和外部抓线功能,支持30a模板,带继电器支持MELT测试。支持热插拔。   VDSH 24路VDSL2 over POTS业务板 支持24路VDSL2 over POTS接入,支持线路保护和外部抓线功能,支持17a模板,不支持30a模板。支持热插拔。   VDTH 24路VDSL2 over ISDN业务板 支持24路VDSL2 over ISDN接入,支持线路保护和外部抓线功能,支持17a模板,不支持30a模板。支持热插拔。   VDSE 24路VDSL2 over POTS业务板 支持24路VDSL2 over POTS接入,内置分离器,支持17a模板,不支持30a模板。支持热插拔。   SHLH 16路SHDSL业务板 支持16路SHDSL接入,支持线路保护和外部抓线功能。支持热插拔。
2023-06-19 11:09:291

LaurenceBenoit是做什么的

LaurenceBenoitLaurenceBenoit,服装设计,主要作品《30°的颜色》、《记忆角落》、《第一天》。外文名:LaurenceBenoit职业:服装设计代表作品:《30°的颜色》合作人物:LucienJean-Baptiste
2023-06-19 11:09:311

钟丽缇有几个女儿

钟丽缇有3个女儿
2023-06-19 11:09:423

芙罗兰适合什么年龄

20多岁的人最适合,呵呵
2023-06-19 11:09:442

西索是谁啊

变态《猎人》里的大变态~~~~
2023-06-19 11:08:497

Flotia中文什么意思?

Flotia中文意思可以是弗洛里亚,是一个英文名。也可以是地名佛罗里达。例句:Is the weather different in Floria?与佛罗里达的天气不同 吗 ?
2023-06-19 11:08:491

走遍法国第一课课文意思有点不明白。

这两个人说话都很没礼貌
2023-06-19 11:08:472

帮忙取个英文名

Riches
2023-06-19 11:08:424

FIoria的翻译是:什么意思

你好!Floria [词典] [人名] 弗洛里亚; [例句]Today is my goddaughter Floria"s birthday.今天是我的干女儿floriad生日。
2023-06-19 11:08:411

英文名建议!!!Emily和Floria哪个好!?!?

floria。emily像女仆的名字
2023-06-19 11:08:322

dell电脑一体机开机要按F1才能开机

这文字说明你电源有问题啊,是不是更换过电源
2023-06-19 11:08:315

钟丽缇有几个孩子,都叫什么名字?

钟丽缇第一任老公是来自比利时的GlennRoss,第二任老公是音乐诗人严铮,现任老公是张伦硕。钟丽缇有3个孩子,大女儿Yasmine、二女儿Jaden、小女儿Cayla,现在3个女儿已经都改姓为张了。2015年,钟丽缇和张伦硕相识于真人秀节目《如果爱》,并迅速坠入了爱河谈起恋爱。相差12岁的姐弟恋让人意外难以置信,但是钟丽缇和张伦硕却做好了结婚的准备了。2016年11月,钟丽缇和张伦硕携手走进婚姻殿堂。此时的钟丽缇已经46岁了。婚后的钟丽缇过得很幸福,但是却有个遗憾,没能为张伦硕生一个孩子。为了拼四胎,钟丽缇豁出去的药物备孕,执意做试管婴儿。即便因为药物导致身材臃肿也毫不在乎,钟丽缇认为现在所付出的一切都是值得的。
2023-06-19 11:08:301

钟丽缇三个女儿年龄分别多大

钟丽缇大女儿:19虚岁二女儿:9虚岁三女儿:7虚岁1998年,钟丽缇怀孕产女,安心与外籍丈夫glenross过婚姻生活,二人育有一女yasmineross,但好景不长,婚姻于2002年宣布结束。在第一段婚姻未结束时,钟丽缇与其第二任丈夫严铮相识,在2004年两人办理婚礼并开始7年的婚姻生活,2008年,钟丽缇在北京生下一名女婴取名为jaden,2010年在北京诞下cayla。
2023-06-19 11:08:211

“芙萝娅”用英文怎么翻译?

这个你应该问烟雨江南
2023-06-19 11:08:164

钟丽缇二女儿生日是哪天

钟丽缇二女儿生日是2010年2月6日。在第一段婚姻未结束时,钟丽缇与其第二任丈夫严铮相识,在2004年两人办理婚礼并开始7年的婚姻生活。2008年,钟丽缇在北京生下一名女婴(二女儿)取名为Jaden2010年在北京诞下Cayla(小女儿)。2011年8月根据钟丽缇本人证实两人已离婚半年。
2023-06-19 11:08:131