-
银行辞职报告怎么写.doc
2021-01-18 18:45:09银行辞职报告怎么写1 尊敬的领导: 您好! 由于一些个人的原因,我决定向您提出辞职申请,申请与银行解除劳动合同。 离开银行并不是我的所愿,但是由于自身的条件已经达不到到银行的要求了,银行工作十分难得,... -
督查情况通报怎么写.doc
2021-01-15 20:39:03督查情况通报怎么写 督查情况通报怎么写呢?有哪些具体格式?下面小编给大家带来督查情况通报范文,供大家参考!督查情况通报范文一 各县(区)、市直各单位: 月日至月日,市软建办效能督查组会同市创模办对各县(区)所... -
java方面的文献综述怎么写_如何写文献综述?
2021-01-09 11:08:30不管是本科毕业论文还是硕士毕业论文,都要写文献综述,文献综述是对所引用文献的综合评述,通过参考文献确定选题方向,确定选题后广泛阅读与选题相关的参考文献,通过自身的主观理解和研究水平对所收集到的文献进行...不管是本科毕业论文还是硕士毕业论文,都要写文献综述,文献综述是对所引用文献的综合评述,通过参考文献确定选题方向,确定选题后广泛阅读与选题相关的参考文献,通过自身的主观理解和研究水平对所收集到的文献进行综合分析,从而提出自己的见解和研究思路。
通常,文献综述包括四个部分:摘要、引言、主题、参考文献。
1、摘要,字数应控制在200字左右,不宜过长或过短。论文摘要主要是对全文内容的提炼,重点在于从研究目的、研究方法、研究结论等方面进行总结。不要忘了,摘要写完后,我们还需要根据摘要的内容与论文内容,选择3-5个关键词加在摘要后面。
2、引言,引言是论文的“开场白”,它的作用就是简单地叙述文章的研究过程,以此唤起读者继续阅读论文的欲望,可见引言的写作也十分重要。
3、主题,文章的主要部分来自于文章的题目,题目的写作方法其实很多,没有特定的框架和格式,但是,不管你用哪种方法来写文献综述,都需要我们对所收集到的资料进行整理和分析,把文章的中心思想表达出来。
4、参考文献,参考文献写得多,写得少,能很好地体现我们写论文时的阅读深度,往往参考文献越全面,说明我们写论文时越细心、认真。尽管说毕业论文对参考文献的数量没有严格的要求,但尽量控制在30篇左右为宜。收集文献时,建议可多方面阅读,从中选择适合自己写作论据的主题,但尽量选择近些年来的文献作为参考,对时间较早的文献不宜过多,要避免观点过于陈旧,可适当引用与研究相关的经典文献。
-
简单的辞职信怎么写.doc
2021-01-18 18:44:27简单的辞职信怎么写 1.公司领导: 本人由于个人原因,准备和公司解除劳动关系,为此给公司带来不便敬请谅解!请于审批,并安排人员接手我的工作。 此致! 敬礼! 申请人:*** 时间:******* 2.尊敬的领导: 您好... -
100到200C语言求素数_C语言编程求解:1到1000之间所有的素数
2021-01-14 14:44:53点击上方蓝字“C语言修仙”关注...想法是写一个循环,循环里依次除以从2到这个数减1的所有的整数,如果都不能整除,说明这个数是素数;如果出现一个能整除的数,那么这个数不是素数。(其实,判断素数还可以优化,循...点击上方蓝字“C语言修仙”关注公众号哦先给出素数的定义:
素数是只能被1和自身整出的整数。
1不是素数
算法思考:
判断一个数是不是素数,只需要判断它是不能只能被1和自身整除。
那怎么判断一个数不能被除1和自身之外的其他数整除呢?想法是写一个循环,循环里依次除以从2到这个数减1的所有的整数,如果都不能整除,说明这个数是素数;如果出现一个能整除的数,那么这个数不是素数。
(其实,判断素数还可以优化,循环里依次除以从2到这个数平方根的所有的整数就可以了。因为假设一个数n,除以2~根号n的整数,都不能整除,那么除以根号n~n-1的整数也不能整数。在文章最后再贴上优化的代码。)
那怎么判断能不能整除呢?我么知道C语言有求余数的运算符%,如果余数是0,那么说明能整除了。
我们来写程序代码。这里,说明一下,当你写一个具有某个功能的代码的时候,把这个功能写成一个函数,而不是所有的代码都放在main函数里。在main函数里调用这个你写的函数。
给函数命名,如果你知道或者查到了素数的英文单词是prime number,那么函数可以起名为 is_primer_number(如果你不知道素数的英文单词,那么随便起个名字也可以,比如叫fun)。因为要传递一个代判断的整数,所以有一个int类型参数。返回值我们用bool型(代码里要包含头文件stdbool.h),如果是素数返回true,如果不是素数返回false。
代码:
bool is_prime_number(int a){
for (int i = 2; i
if (a % i == 0)
return false;
}
return true;
}判断是不是素数的函数写好了。题目是要求1到1000之间所有的函数。你可以再写一个函数,函数的功能是求1到某个整数之间的所有素数并打印。函数命名为print_prime_num。有一个int类型参数。返回值我们写为整型,返回素数的个数。
循环把2到这个数之间的每个整数,作为参数,传给上面写的函数is_prime_number(),如果是素数,就打印。
int print_prime_number(int a){
int count = 0;
for (int i = 2; i<=a; i++ ){
if(is_prime_number(a)){
count++;
printf("%d\n", a);
}
}
}main函数的写法。输入一个整数,作为参数,传给函数print_prime_number()处理:
int main (){
int a;
printf("求1到一个整数之间所有的素数.\n");
printf("请输入一个整数: \n");
scanf("%d", &a);
print_prime_number(a);
return 0;
}运行结果:
优化
判断素数的函数还可以优化,循环里依次除以从2到这个数平方根的所有的整数就可以了。因为假设一个数n,除以2~根号n的整数,都不能整除,那么除以根号n~n-1的整数也不能整数。所以我们只要循环2~根号n之间的数就可以了。
函数is_prime_number()可以写为下面这样。这里用到了求平方根的函数sqrt(),要包含头文件math.h。另外,函数sqrt()的返回类型是double,但是这里我们要的是整数,所以加上(int)强制转换为整型。
bool is_prime_number(int a){
for (int i = 2; i int)sqrt(a) +1 ; i++){
if (a % i == 0)
return false;
}
return true;
}运行结果:
点击这里留言和查看留言哦!
在看和收藏也是对作者的鼓励哦!
-
自己动手写操作系统(含源代码).part1
2010-10-18 19:41:25本书以“动手写”为指导思想,只要是跟“动手写”操作系统有关的知识,都作为介绍对象加以讨论,所以,从开发环境的搭建,到保护模式,再到IBMPC中有关芯片的知识,最后到操作系统本身的设计实现,都能在本文中... -
通过audit服务把审计日志从客户端上传到服务器,我该怎么做才能在服务器端看到上传记录的客户端的ip地址?
2019-01-23 11:29:201、linux操作系统是redhat7.0 2、服务器ip是192.168.91.136。客户端ip是192.168.91.200 ...我该怎么配置,或者怎么写脚本,才能在查看服务器日志审计记录时,显示的是上传的客户端的ip地址而不是localhost呢? -
JVAV写贪吃蛇小游戏,用线程实现窗口重绘,然后用键盘指令改变小蛇的方向,请问怎么让小蛇只根据指令移动?
2019-06-05 13:05:29现在的程序能够实现通每隔200ms小蛇自动往前跑一格,通过键盘指令能够改变方向,但是我不想让它自动跑,只想实现给它指令它才移动,请问怎么实现? 这是蛇的活动类 ``` package com.tcs.cn; import java.awt.... -
django 怎么数据加载部分数据到首页?
2018-09-19 02:33:09我的网站首页导航到其他网页,其他数据都是从数据库读取的数据。我想要在首页显示几条最近的数据,例如只显示新闻页面的前5条,点击读取更多跳转新闻页面。我的首页使用table,一部分填充了news_widget.html页面。 我... -
C#怎么从引用进来的接口类里面取出来所有参数和参数下的所有字段。
2015-03-24 02:23:53//service是引用进来的接口类,out_order_search是我写的方法 protected void out_order_search() { string strdate = string.Empty; string user = commonws.GetYWType("SAP接口用户名"); string password = ... -
自己动手写操作系统(含源代码).part2
2010-10-18 19:47:45本书以“动手写”为指导思想,只要是跟“动手写”操作系统有关的知识,都作为介绍对象加以讨论,所以,从开发环境的搭建,到保护模式,再到IBMPC中有关芯片的知识,最后到操作系统本身的设计实现,都能在本文中... -
网管教程 从入门到精通软件篇.txt
2010-04-25 22:43:49网管教程 从入门到精通软件篇 ★一。★详细的xp修复控制台命令和用法!!! 放入xp(2000)的光盘,安装时候选R,修复! Windows XP(包括 Windows 2000)的控制台命令是在系统出现一些意外情况下的一种非常有效的... -
【ASP】 网页中的select下拉选择框读取不到值是怎么回事呢?
2020-04-14 18:13:55ASP写的网站。 【前提】在“专家级别”这个下拉框中有“ ”和“A类专家”和“普通专家”这三个选项。默认是“ ”,然后每次页面加载的时候,从数据库中读取“专家级别”的数据,赋值... -
Android 怎么将主程序添加到欢迎界面里面
2013-06-27 01:15:37我做好了一个欢迎界面,并且做了下按钮触发,里面什么都还没有,我这边有一个游戏主程序,应该怎么样才能合理的添加进去呢? 添加的结果就是 点击这个按钮 就进入这个主程序。下面是代码 这个是我的欢迎界面的代码... -
走到右上角时可以获得的最大金币数目的运算,怎么采用C程序的语言代码编写技术去实现的呢?
2019-05-13 23:50:53:”,其中问号处应填入当前的数据组数,组数从1开始计算。 每组测试数据输出一行,输出一个整数,代表根据最优的打法,你走到右上角时可以获得的最大金币数目。 Sample Input 2 3 4 1 -1 1 0 2 -2 4 2 3... -
数组走到右上角时可以获得的最大金币数目,请问怎么样才能使用C语言的程序的编写的技术实现的?
2019-05-05 20:46:44:”,其中问号处应填入当前的数据组数,组数从1开始计算。 每组测试数据输出一行,输出一个整数,代表根据最优的打法,你走到右上角时可以获得的最大金币数目。 Sample Input 2 3 4 1 -1 1 0 2 -2 4 2 3... -
200SMART指令中的FOR循环指令
2020-11-27 14:46:41VW10 从1变到30,就是重复执行30次,这句话不像是人话啊,大家都喜欢我说人话。 假设某个人被拘留30天,日子好难熬啊,他就在墙上写个数字,从1开始,第二天就把1改成2,第三天就把2改成3,以此类推,最后数字变成...老师教你回家把课文抄10遍,那你就要乖乖滴回家抄10遍,你要让机器乖乖的干30次,那你就用一个FOR指令,其实啊,如果你没弄过PLC编程,我说FOR指令,估计你还是没感觉,那我怎么解释才能让你听懂呢,假如我说:
VW10 从1变到30,就是重复执行30次,这句话不像是人话啊,大家都喜欢我说人话。
假设某个人被拘留30天,日子好难熬啊,他就在墙上写个数字,从1开始,第二天就把1改成2,第三天就把2改成3,以此类推,最后数字变成30,他就可以出去了。
所以这里也是一样的,VW10就是一个数字符号,一开始等于1,然后就变成2,变成3,一直到30,就不再变了。
以后呢,等以后啊,你更熟悉了,我就不说VW10是一个符号了,我会说它是PLC的一个内存地址,它占用2个字节的空间,现在我不能这样解释,因为你会说我讲话不接地气。但是,你总有一天会对内存地址、字节、字、双字、位,熟悉的不能再熟悉,刻骨铭心!
佳途自动化学院位于苏州市工业园区独墅湖畔,股东背景雄厚,先后获得了中路股份(股票代码:600818)、帮实科技(股票代码:872038)厚石资本、江山恒创等多家上市公司及地方国资委创投基金投资入股,专门从事工业机器人及自动化领域的技能培训,已成为国内较为领先的工业自动化人才专业培训机构,大家不妨去看看吧:https://edu.jiatuxueyuan.com -
大大们,实在不行了,关于从json的图片url获取图片添加到imageview
2016-06-19 10:46:02首先呢,附上我的代码,字符串可以获取,唯独图片获取不到,这该怎么办,大大们帮忙看看,给我点...其次呢,我对线程不是很了解,能不能有大大给我讲解一下它的用法,就拿我这个例子来说,应该怎么写线程就能使ui不堵塞 -
iframe的src如何从链接赋值?
2019-01-14 21:23:49之前问了问题,想要在首页点击链接,跳转到m.html,并且指定m页面包含的iframe 的内容,按照大神的指点, ...结果页面什么都没有显示出来,因为完全不懂js,完全不知道怎么写,请指点一下问题,谢谢 -
求问C# 怎么开发这个协议,从来没做过,求个demo
2016-12-27 09:42:26例如:写从设备1的地址40001开始的1个保持寄存器值12 34: 01 10 00 00 00 01 02 12 34 AB 27 其中: 01 (HEX):从机地址 10 (HEX):功能码 00 (HEX):起始地址(40001-40001)高字节 00 (HEX):起始... -
webpack从入门到会玩(2)- 样式资源
2020-08-27 10:16:32前面讲到了webpack默认只能处理JS和JSON文件,那么项目中的其他资源有怎么处理呢?我们先来看看样式文件的处理方式吧。 把demo项目的目录定义的规范一些: 把index.js移动到js目录中,新建了一个styles目录,里面...webpack处理样式文件
前面讲到了webpack默认只能处理JS和JSON文件,那么项目中的其他资源有怎么处理呢?我们先来看看样式文件的处理方式吧。
把demo项目的目录定义的规范一些:
把index.js移动到js目录中,新建了一个styles目录,里面新建一个index.css,简单写一些样式。
index.css:
html, body { margin: 0; padding: 0; } .box1 { width: 100px; height: 200px; }
在index.html里面添加一个div,class为box1。
index.html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>demo</title> </head> <body> <div class="box1"></div> </body> <!-- <script src="./index.js"></script> --> <script src="./build/build.js"></script> </html>
在index.js中引入index.css。
index.js:
import '../styles/index.css' import {sum} from './modules/foo' console.log(sum(1, 2))
上一篇中提到webpack.config.js的核心概念中,有一个loader,就是用来针对处理各种的资源,CSS样式文件需要用到两个loader,style-loader和css-loader,需要先安装这两个loader,然后修改webpack.config.js的配置。
安装style-loader和css-loader:
npm i style-loader css-loader -D
说明一下两个loader的作用:
- css-loader:将CSS样式添加到JS文件中。
- style-loader:将JS中的样式作为style标签插入html中。
所有必须要先执行css-loader,再执行style-loader。
在webpack.config.js中添加两个loader的配置。
webpack.config.js:
// nodejs自带的路径解析工具 const {resolve} = require('path') // commonjs的规范 module.exports = { // 项目的入口JS文件 entry: './js/index.js', // 输出配置 output: { // 构建好的文件输出的目录 // 这里需要绝对路径,所以要用到resolve函数来计算项目根目录的绝对路径 // 输出到项目根目录下的build目录下 path: resolve(__dirname, 'build'), // 输出文件名 filename: 'build.js' }, module: { // loader会写rules数组里面 rules: [ // css样式处理 { // 正则表达式匹配需要处理的文件 // 匹配.css结尾的文件 test: /\.css$/, // 需要多个loader是用use配置 // loader的执行顺序是从数组的最后一个元素开始 // 所以第一个元素是style-loader,第二个元素是css-loader use: ['style-loader', 'css-loader'] } ] }, // 插件会卸载plugins数组里面 plugins: [], // 构建模式 mode: 'development' }
使用webpack命令构建项目:
webpack
用浏览器打开index.html看到样式已经生效。
再检查元素,看看dom的结构,可以看到我们的样式以style标签插入到html中了。
再看看构建处理的build.js,会发现样式被构建到了JS里面了,所以index.html只需要引入build.js,再build.js执行时,就会把样式作为style标签插入index.html中。
但是项目中往往会存在很多CSS代码的,如果全部都构建到JS中,会使JS文件变得很大,影响页面加载速度,因此我们一般希望把CSS代码提取出来,另外构建,这时我们需要用到mini-css-extract-plugin这个插件。
提取CSS插件
首先要安装mini-css-extract-plugin。
npm i mini-css-extract-plugin -D
为了更好看到效果,我们添加多一个CSS文件。
box2.css:
.box2 { width: 100px; height: 100px; background-color: deeppink; }
再index.html中添加一个div,class为box2。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>demo</title> </head> <body> <div class="box1"></div> <div class="box2"></div> </body> <!-- <script src="./index.js"></script> --> <script src="./build/build.js"></script> </html>
再index.js中引入box2.css。
index.js:
import '../styles/index.css' import '../styles/box2.css' import {sum} from './modules/foo' console.log(sum(1, 2))
在webpack.config.js中添加mini-css-extract-plugin的相关配置。
webpack.config.js:
// nodejs自带的路径解析工具 const { resolve } = require('path') // 引入提取css插件 const MiniCssExtractPlugin = require('mini-css-extract-plugin') // commonjs的规范 module.exports = { // 项目的入口JS文件 entry: './js/index.js', // 输出配置 output: { // 构建好的文件输出的目录 // 这里需要绝对路径,所以要用到resolve函数来计算项目根目录的绝对路径 // 输出到项目根目录下的build目录下 path: resolve(__dirname, 'build'), // 输出文件名 filename: 'build.js' }, module: { // loader会写rules数组里面 rules: [ // css样式处理 { // 正则表达式匹配需要处理的文件 // 匹配.css结尾的文件 test: /\.css$/, // 需要多个loader是用use配置 // loader的执行顺序是从数组的最后一个元素开始 // 所以第一个元素是style-loader,第二个元素是css-loader use: [ // 用MiniCssExtractPlugin.loader代替style-loader { loader: MiniCssExtractPlugin.loader, options: { // 建议指定构建后的build目录相对路径 // 相对于提取的build.css的相对路径 // 这样做可以避免CSS中使用url加载其他资源时,路径错误的问题 publicPath: '../' } }, 'css-loader' ] } ] }, // 插件会卸载plugins数组里面 plugins: [ // 配置提取css插件 new MiniCssExtractPlugin({ // 提取的CSS代码输出在build/styles/build.css中 filename: 'styles/build.css' }) ], // 构建模式 mode: 'development' }
步骤说明:
- 用require函数引入mini-css-extract-plugin。
- 在plugins中添加该插件的配置。
- 用MiniCssExtractPlugin.loader替换style-loader,因为已经不需要用JS来插入style标签了。
用webpack命令构建项目。
webpack
构建完成后,发现build目录中多了一个styles目录,里面有一个build.css,这是我们在plugins中配置的CSS代码输出文件,所以CSS代码都提取到里面去了。
build.js中对index.css构建的代码也变成了下面这样,说明用mini-css-extract-plugin处理了。实际上CSS的提取工作已经完成了,但是我们会发现index.html根本没有引入build.css,样式肯定不会生效的,难道我们每次都要手动把资源引入到index.html中吗?当然不用,我们可以使用html-webpack-plugin来帮我们自动化引入资源。
html文件处理插件
首先还是要先安装html-webpack-plugin。
npm i html-webpack-plugin -D
在webpack.config.js中添加相应配置。
webpack.config.js:
// nodejs自带的路径解析工具 const { resolve } = require('path') // 引入提取css插件 const MiniCssExtractPlugin = require('mini-css-extract-plugin') // 引入html文件处理插件 const HtmlWebpackPlugin = require('html-webpack-plugin') // commonjs的规范 module.exports = { // 项目的入口JS文件 entry: './js/index.js', // 输出配置 output: { // 构建好的文件输出的目录 // 这里需要绝对路径,所以要用到resolve函数来计算项目根目录的绝对路径 // 输出到项目根目录下的build目录下 path: resolve(__dirname, 'build'), // 输出文件名 filename: 'build.js' }, module: { // loader会写rules数组里面 rules: [ // css样式处理 { // 正则表达式匹配需要处理的文件 // 匹配.css结尾的文件 test: /\.css$/, // 需要多个loader是用use配置 // loader的执行顺序是从数组的最后一个元素开始 // 所以第一个元素是style-loader,第二个元素是css-loader use: [ // 用MiniCssExtractPlugin.loader代替style-loader { loader: MiniCssExtractPlugin.loader, options: { // 建议指定构建后的build目录相对路径 // 相对于提取的build.css的相对路径 // 这样做可以避免CSS中使用url加载其他资源时,路径错误的问题 publicPath: '../' } }, 'css-loader' ] } ] }, // 插件会卸载plugins数组里面 plugins: [ // 配置提取css插件 new MiniCssExtractPlugin({ // 提取的CSS代码输出在build/styles/build.css中 filename: 'styles/build.css' }), // html文件处理插件 new HtmlWebpackPlugin({ // 指定要处理的html文件 template: './index.html' }) ], // 构建模式 mode: 'development' }
步骤说明:
- 引入用requrie函数引入html-webpack-plugin。
- 在plugins中添加相应配置。
html-webpack-plugin会自动加载所以用到的资源到指定的html中,所以index.html中的script标签也要删除,否则会重复加载。
index.html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>demo</title> </head> <body> <div class="box1"></div> <div class="box2"></div> </body> </html>
我们重新构建项目,看到build目录中多了一个index.html。
里面会自动加载build.js和build.css。
这样我们写的JS和CSS都能生效了。
对于前端来说最头疼的莫过于浏览器兼容了,这会让我们做很多枯燥乏味的事情,现在我们只需要引入一个postcss-loader就可以通过webpack来自动完成大部分的兼容工作,解放生产力!
样式浏览器兼容性出路
我们需要用到postcss-loader和postcss-preset-env两个依赖,安装一下。
npm i postcss-loader postcss-preset-env -D
在webpack.config.js的css样式处理部分中追加postcss-loader的配置。
webpack.config.js:
// nodejs自带的路径解析工具 const { resolve } = require('path') // 引入提取css插件 const MiniCssExtractPlugin = require('mini-css-extract-plugin') // 引入html文件处理插件 const HtmlWebpackPlugin = require('html-webpack-plugin') // commonjs的规范 module.exports = { // 项目的入口JS文件 entry: './js/index.js', // 输出配置 output: { // 构建好的文件输出的目录 // 这里需要绝对路径,所以要用到resolve函数来计算项目根目录的绝对路径 // 输出到项目根目录下的build目录下 path: resolve(__dirname, 'build'), // 输出文件名 filename: 'build.js' }, module: { // loader会写rules数组里面 rules: [ // css样式处理 { // 正则表达式匹配需要处理的文件 // 匹配.css结尾的文件 test: /\.css$/, // 需要多个loader是用use配置 // loader的执行顺序是从数组的最后一个元素开始 // 所以第一个元素是style-loader,第二个元素是css-loader use: [ // 用MiniCssExtractPlugin.loader代替style-loader { loader: MiniCssExtractPlugin.loader, options: { // 建议指定构建后的build目录相对路径 // 相对于提取的build.css的相对路径 // 这样做可以避免CSS中使用url加载其他资源时,路径错误的问题 publicPath: '../' } }, 'css-loader', // css浏览器兼容性处理 // !!!需要在package.json中添加browserslist配置指定浏览器兼容策略 { loader: 'postcss-loader', options: { // 固定写法,不管它 iden: 'postcss', // 使用postcss-preset-env来处理样式兼容问题 // 这里需要写一个返回数组的函数 // 固定写法,记住就行 plugins: () => [require('postcss-preset-env')()] } } ] } ] }, // 插件会卸载plugins数组里面 plugins: [ // 配置提取css插件 new MiniCssExtractPlugin({ // 提取的CSS代码输出在build/styles/build.css中 filename: 'styles/build.css' }), // html文件处理插件 new HtmlWebpackPlugin({ // 指定要处理的html文件 template: './index.html' }) ], // 构建模式 mode: 'development' }
在package.json中添加browserslist配置,指定浏览器兼容策略。
package.json(不要全部复制,只需要复制browserslist项就行哦):
{ "name": "demo", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC", "devDependencies": { "css-loader": "^4.2.2", "html-webpack-plugin": "^4.3.0", "mini-css-extract-plugin": "^0.10.0", "postcss-loader": "^3.0.0", "postcss-preset-env": "^6.7.0", "style-loader": "^1.2.1", "webpack": "^4.44.1", "webpack-cli": "^3.3.12" }, "browserslist": { "development": [ "last 1 chrome version", "last 1 firefox version", "last 1 safari version" ], "production": [ ">0.1%", "not dead", "not op_mini all" ] } }
browserslist的配置分成开发环境和生产环境两部分,开发环境我们简单配置:last 1 chrome version就是最后一个版本的chrome浏览器的意思,后面同理。
生产环境这里的配置是:
-
0.1%:兼容99.9%以上的浏览器。
- not dead:不兼容已经被弃用的浏览器。
- not op_mini all:不兼容opera mini所有版本浏览器,因为已经基本没人用了。
npm官网有browserslist的详细说明,大家有兴趣去了解一下。
为了看到效果,我们在index.css中添加一些存在兼容性问题的样式。
index.css:
html, body { margin: 0; padding: 0; } .box1 { width: 100px; height: 200px; background-color: pink; display: flex; backface-visibility: hidden; } .box2 { width: 100px; height: 100px; background-color: deeppink; }
现在用webpack命令构建项目。
webpack
我们看到build.css里面自动添加了浏览器兼容的样式代码。
要注意的是,postcss-loader默认使用的是生产环境,其配置于webpack.config.js中的mode没有关系,而是使用nodejs的运行环境,所以想要切换成开发环境,需要在webpack.config.js中添加代码:process.env.NODE_ENV = 'development’
CSS压缩
当然,项目中的CSS都是很庞大的,我们往往希望能将其压缩一下,此时需要一个名字很长的插件帮助我们:optimize-css-assets-webpack-plugin。
首先安装一下:
npm i optimize-css-assets-webpack-plugin -D
然后在webpack.config.js中添加插件配置。
webpack.config.js:
// nodejs自带的路径解析工具 const { resolve } = require('path') // 引入提取css插件 const MiniCssExtractPlugin = require('mini-css-extract-plugin') // 引入html文件处理插件 const HtmlWebpackPlugin = require('html-webpack-plugin') // 引入css压缩插件 const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin') // browserslist的开发和生产环境切换根webpack的mode没有关系,而是读取nodejs的运行环境 process.env.NODE_ENV = 'development' // commonjs的规范 module.exports = { // 项目的入口JS文件 entry: './js/index.js', // 输出配置 output: { // 构建好的文件输出的目录 // 这里需要绝对路径,所以要用到resolve函数来计算项目根目录的绝对路径 // 输出到项目根目录下的build目录下 path: resolve(__dirname, 'build'), // 输出文件名 filename: 'build.js' }, module: { // loader会写rules数组里面 rules: [ // css样式处理 { // 正则表达式匹配需要处理的文件 // 匹配.css结尾的文件 test: /\.css$/, // 需要多个loader是用use配置 // loader的执行顺序是从数组的最后一个元素开始 // 所以第一个元素是style-loader,第二个元素是css-loader use: [ // 用MiniCssExtractPlugin.loader代替style-loader { loader: MiniCssExtractPlugin.loader, options: { // 建议指定构建后的build目录相对路径 // 相对于提取的build.css的相对路径 // 这样做可以避免CSS中使用url加载其他资源时,路径错误的问题 publicPath: '../' } }, 'css-loader', // css浏览器兼容性处理 { loader: 'postcss-loader', options: { // 固定写法,不管它 iden: 'postcss', // 使用postcss-preset-env来处理样式兼容问题 // 这里需要写一个返回数组的函数 // 固定写法,记住就行 plugins: () => [require('postcss-preset-env')()] } } ] } ] }, // 插件会卸载plugins数组里面 plugins: [ // 配置提取css插件 new MiniCssExtractPlugin({ // 提取的CSS代码输出在build/styles/build.css中 filename: 'styles/build.css' }), // html文件处理插件 new HtmlWebpackPlugin({ // 指定要处理的html文件 template: './index.html' }), // css压缩插件 new OptimizeCssAssetsWebpackPlugin() ], // 构建模式 mode: 'development' }
步骤说明:
- 引入optimize-css-assets-webpack-plugin插件。
- 在plugins中实例化。
构建项目看看效果,看到build.css被压缩成一行了。
对CSS样式的处理基本完成了,但是我们很多时候会使用到less、sass等CSS预处理工具,这些样式又怎么处理呢?下面我们以less为例说明。
CSS预处理工具的构建
其实很简单,只需要添加对应的loader就可以了。以less为例,我们需要安装less-loader,其作用是将less代码转换成css代码。
npm i less-loader -D
如果项目中没有less,还需要安装less。
npm i less -D
我们在styles文件夹中添加index.less文件。
index.less:
html, body { background-color: #666666; div { margin-bottom: 10px; } }
在webpack.config.js中的rules中添加对less文件的处理。
webpack.config.js:
// nodejs自带的路径解析工具 const { resolve } = require('path') // 引入提取css插件 const MiniCssExtractPlugin = require('mini-css-extract-plugin') // 引入html文件处理插件 const HtmlWebpackPlugin = require('html-webpack-plugin') // 引入css压缩插件 const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin') // browserslist的开发和生产环境切换根webpack的mode没有关系,而是读取nodejs的运行环境 process.env.NODE_ENV = 'development' // commonjs的规范 module.exports = { // 项目的入口JS文件 entry: './js/index.js', // 输出配置 output: { // 构建好的文件输出的目录 // 这里需要绝对路径,所以要用到resolve函数来计算项目根目录的绝对路径 // 输出到项目根目录下的build目录下 path: resolve(__dirname, 'build'), // 输出文件名 filename: 'build.js' }, module: { // loader会写rules数组里面 rules: [ // css样式处理 { // 正则表达式匹配需要处理的文件 // 匹配.css结尾的文件 test: /\.css$/, // 需要多个loader是用use配置 // loader的执行顺序是从数组的最后一个元素开始 // 所以第一个元素是style-loader,第二个元素是css-loader use: [ // 用MiniCssExtractPlugin.loader代替style-loader { loader: MiniCssExtractPlugin.loader, options: { // 建议指定构建后的build目录相对路径 // 相对于提取的build.css的相对路径 // 这样做可以避免CSS中使用url加载其他资源时,路径错误的问题 publicPath: '../' } }, 'css-loader', // css浏览器兼容性处理 { loader: 'postcss-loader', options: { // 固定写法,不管它 iden: 'postcss', // 使用postcss-preset-env来处理样式兼容问题 // 这里需要写一个返回数组的函数 // 固定写法,记住就行 plugins: () => [require('postcss-preset-env')()] } } ] }, // less样式处理 { // 正则表达式匹配需要处理的文件 // 匹配.css结尾的文件 test: /\.less$/, // 需要多个loader是用use配置 // loader的执行顺序是从数组的最后一个元素开始 // 所以第一个元素是style-loader,第二个元素是css-loader use: [ // 用MiniCssExtractPlugin.loader代替style-loader { loader: MiniCssExtractPlugin.loader, options: { // 建议指定构建后的build目录相对路径 // 相对于提取的build.css的相对路径 // 这样做可以避免CSS中使用url加载其他资源时,路径错误的问题 publicPath: '../' } }, 'css-loader', // css浏览器兼容性处理 { loader: 'postcss-loader', options: { // 固定写法,不管它 iden: 'postcss', // 使用postcss-preset-env来处理样式兼容问题 // 这里需要写一个返回数组的函数 // 固定写法,记住就行 plugins: () => [require('postcss-preset-env')()] } }, 'less-loader' ] } ] }, // 插件会卸载plugins数组里面 plugins: [ // 配置提取css插件 new MiniCssExtractPlugin({ // 提取的CSS代码输出在build/styles/build.css中 filename: 'styles/build.css' }), // html文件处理插件 new HtmlWebpackPlugin({ // 指定要处理的html文件 template: './index.html' }), // css压缩插件 new OptimizeCssAssetsWebpackPlugin() ], // 构建模式 mode: 'development' }
说明:在rules中添加less文件的处理,我们可以看到其实跟css的出路几乎是一样的,只不过在后面添加了一个less-loader而已,less-loader只是把less文件转换成css文件而已,然后再按照css的方法来处理即可。这里的代码显得有点重复臃肿,可以将公共部分提取出来。
webpack.config.js:
// nodejs自带的路径解析工具 const { resolve } = require('path') // 引入提取css插件 const MiniCssExtractPlugin = require('mini-css-extract-plugin') // 引入html文件处理插件 const HtmlWebpackPlugin = require('html-webpack-plugin') // 引入css压缩插件 const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin') // browserslist的开发和生产环境切换根webpack的mode没有关系,而是读取nodejs的运行环境 process.env.NODE_ENV = 'development' // 提取样式处理的公共代码 const commonCssLoader = [ // 用MiniCssExtractPlugin.loader代替style-loader { loader: MiniCssExtractPlugin.loader, options: { // 建议指定构建后的build目录相对路径 // 相对于提取的build.css的相对路径 // 这样做可以避免CSS中使用url加载其他资源时,路径错误的问题 publicPath: '../' } }, 'css-loader', // css浏览器兼容性处理 { loader: 'postcss-loader', options: { // 固定写法,不管它 iden: 'postcss', // 使用postcss-preset-env来处理样式兼容问题 // 这里需要写一个返回数组的函数 // 固定写法,记住就行 plugins: () => [require('postcss-preset-env')()] } } ] // commonjs的规范 module.exports = { // 项目的入口JS文件 entry: './js/index.js', // 输出配置 output: { // 构建好的文件输出的目录 // 这里需要绝对路径,所以要用到resolve函数来计算项目根目录的绝对路径 // 输出到项目根目录下的build目录下 path: resolve(__dirname, 'build'), // 输出文件名 filename: 'build.js' }, module: { // loader会写rules数组里面 rules: [ // css样式处理 { // 正则表达式匹配需要处理的文件 // 匹配.css结尾的文件 test: /\.css$/, // 需要多个loader是用use配置 // loader的执行顺序是从数组的最后一个元素开始 // 所以第一个元素是style-loader,第二个元素是css-loader use: [...commonCssLoader] }, // less样式处理 { // 正则表达式匹配需要处理的文件 // 匹配.css结尾的文件 test: /\.less$/, // 需要多个loader是用use配置 // loader的执行顺序是从数组的最后一个元素开始 // 所以第一个元素是style-loader,第二个元素是css-loader use: [ ...commonCssLoader, 'less-loader' ] } ] }, // 插件会卸载plugins数组里面 plugins: [ // 配置提取css插件 new MiniCssExtractPlugin({ // 提取的CSS代码输出在build/styles/build.css中 filename: 'styles/build.css' }), // html文件处理插件 new HtmlWebpackPlugin({ // 指定要处理的html文件 template: './index.html' }), // css压缩插件 new OptimizeCssAssetsWebpackPlugin() ], // 构建模式 mode: 'development' }
重新构建项目看效果,发现less的样式也起作用了。
至此webpack对样式的处理基本完成了,喜欢的点个赞呗!
下一篇讲解图片的处理,拜拜啦!
-
c语言 超级菜的小白请问怎么通过结构体数组中元素将结构体排序?
2018-12-26 19:26:31输入为m+1行,第一行为两个整数m和n,分别表示总人数和可以进入复试人数,m和n之间用空格分隔,0<n<m<200。接下来为m行数据,每行包括三项信息,分别表示一个学生的考号(字符串)、总成绩(整数)和英语单科成绩... -
EXTtbar里的组件怎么和servlet交互
2009-08-13 12:14:13displayMsg:'显示第{0}条到{1}条记录,一共{2}条', emptyMsg:'没有记录' }) }); grid.render(); ds.load({params:{start:0,limit:10}}); }) ... -
怎么把我用controller实现的打印功能通过japplet放在浏览器中实现
2017-11-22 02:51:34我在java程序中写了一个controller,但是现在需要把程序通过japplet放到浏览器中运行,相当于在浏览器中调用我本地的java程序,但是看了许多文章就是搞不好,我现在把我写的打印的小程序发出来,求教大神怎么改 ... -
从逻辑上说, 要么就是非常难想到,要么就是非常难写代码。 这里我总结了几个技巧: 看题目的数据范围, 看能否暴力模拟 暴力枚举所有可能的算法往上套,比如图的题目。 总结和记忆解题模板,减少解题压力 以下是...
-
从零构建前后分离的web项目:前端实战 - 继续打磨前端架构
2020-11-30 10:52:05你去问别人 Vue-Resource 怎么样,他说不要用 Vue-Resource,因为 Vue-Resource 官方已经停止维护了,你应该用 Axios、或者 fetch。但是我们想拥抱 ES6 排除掉了 ES5的fetch(当然也有ES6-... -
按照论文在输入中的顺序排列,先给出的论文排在前面,怎么采用C语言的程序的编写的代码的形式给出答案的
2019-06-25 21:56:33对每个询问,都按被引用的次数从多到少输出满足条件的论文的标题。如果有被引用的次数相同的论文,则按照论文在输入中的顺序排列,先给出的论文排在前面。 Input 输入包含多组数据。 每组数据首先有一行... -
【716-Week 02】由一般化到特殊化演变的树
2020-11-25 07:54:19内结点个数比叶子少1</li><li>完全二叉树第 h 层的从左到右第 k 个结点的编号为 <code>2^h + k - 1</code></li>完全二叉树叶子个数或者和内结点个数相等或者多1</li><li>完全二叉树通过本结点的编号可以快速得到... -
Step1:先画条蛇
2020-12-08 22:52:30如果写到不会写了,就不一定写了哈~ 为啥取名叫先画条蛇,毕竟是做个游戏,功能还是蛮多蛮复杂的,一口气是肯定搞不完的,所以得一步一步来,第一步就是先造条蛇!ÿ... -
“燕云十六将”之Jerry葛涵涛
2009-03-18 08:23:00涵涛跟我沟通的时候表现地很客气,不,确切地说是很谦卑,这让我感觉不错,于是决定在CSDN开博,当时根本没想着能写怎么样、写到哪步田地。后来接触多了,我们成了朋友,我才知道涵涛有着辉煌的历史、过人