0

0

webpack进阶之插件篇_html/css_WEB-ITnose

php中文网

php中文网

发布时间:2016-06-24 11:15:13

|

1520人浏览过

|

来源于php中文网

原创

故事AI绘图神器
故事AI绘图神器

文本生成图文视频的AI工具,无需配音,无需剪辑,快速成片,角色固定。

下载

上一篇博客讲解了webpack环境的基本,这一篇讲解一些更深入的内容和开发技巧。基本环境搭建就不展开讲了

一、插件篇

1. 自动补全css3前缀

autoprefixer

立即学习前端免费学习笔记(深入)”;

官方是这样说的: Parse CSS and add vendor prefixes to CSS rules using values from the Can I Use website ,也就是说它是一个自动检测兼容性给各个浏览器加个内核前缀的插件。

举个栗子:最新的弹性盒模型flux实际代码:

:fullscreen a {    display: flex}

插件自动补充后

a {    display: -webkit-box;    display: -webkit-flex;    display: -ms-flexbox;    display: flex}

效果显而易见,我们可以更专注于css布局和美化,而不需要花过多的精力都写相同的外码而加上不同的前缀,也减少了冗余代码。

使用方法:

cnpm install --save-dev autoprefixer postcss-loader

var autoprefixer = require('autoprefixer');module.exports={  //其他配置这里就不写了  module:{    loaders:[    {      test://.css$/,      //在原有基础上加上一个postcss的loader就可以了      loaders:['style-loader','css-loader','postcss-loader']      }      ]  },  postcss:[autoprefixer({browsers:['last 2 versions']})]}

2. 自动生成html插件

html-webpack-plugin

cnpm install html-webpack-plugin --save-dev

  //webpack.config.js  var HtmlWebpackPlugin = require('html-webpack-plugin');  module.exports={    entry:'./index.js',    output:{      path:__dirname+'/dist',      filename:'bundle.js'    }    plugins:[      new HtmlWebpackPlugin()    ]  }

作用:它会在dist目录下自动生成一个index.html

<!DOCTYPE html><html>  <head>    <meta charset="UTF-8">    <title>Webpack App</title>  </head>  <body>    <script src="bundle.js"></script>  </body></html>

其他配置参数:

{  entry: 'index.js',  output: {    path: 'dist',    filename: 'bundle.js'  },  plugins: [    new HtmlWebpackPlugin({      title: 'My App',      filename: 'admin.html',      template:'header.html',      inject: 'body',      favicon:'./images/favico.ico',      minify:true,      hash:true,      cache:false,      showErrors:false,      "chunks": {      "head": {        "entry": "assets/head_bundle.js",        "css": [ "main.css" ]      },      xhtml:false    })  ]}
--- header.html ---<!DOCTYPE html><html>  <head>    <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>    <title><%= htmlWebpackPlugin.options.title %></title>  </head>  <body>  </body></html>

作用:

  title: 设置title的名字     filename: 设置这个html的文件名     template:要使用的模块的路径    inject: 把模板注入到哪个标签后 'body',     favicon: 给html添加一个favicon  './images/favico.ico',     minify:是否压缩  true false     hash:是否hash化 true false ,       cache:是否缓存,     showErrors:是否显示错误,    chunks:目前没太明白    xhtml:是否自动毕业标签 默认false  

3. 提取样式插件

extract-text-webpack-plugin

官网是这么解释的 Extract text from bundle into a file. ,把额外的数据加到编译好的文件中

var ExtractTextPlugin = require("extract-text-webpack-plugin");module.exports = {    module: {        loaders: [            { test: //.css$/, loader: ExtractTextPlugin.extract("style-loader", "css-loader") }        ]    },    plugins: [        new HtmlWebpackPlugin({                template: './src/public/index.html',                inject: 'body'            }),        new ExtractTextPlugin("[name].[hash].css")    ]}

说明:将css放到index.html的body上面

4. 拷贝资源插件

copy-webpack-plugin

官方这样解释 Copy files and directories in webpack ,在webpack中拷贝文件和文件夹

cnpm install --save-dev copy-webpack-pluginnew CopyWebpackPlugin([{    from: __dirname + '/src/public'}]),

作用:把public 里面的内容全部拷贝到编译目录

参数 作用 其他说明
from 定义要拷贝的源目录 from: __dirname + ‘/src/public’
to 定义要烤盘膛的目标目录 from: __dirname + ‘/dist’
toType file 或者 dir 可选,默认是文件
force 强制覆盖先前的插件 可选 默认false
context 不知道作用 可选 默认 base context 可用 specific context
flatten 只拷贝文件不管文件夹 默认是false
ignore 忽略拷贝指定的文件 可以用模糊匹配

5. 全局挂载插件

webpack.ProvidePlugin [webpack内置插件 ]

new webpack.ProvidePlugin({    $: "jquery",    jQuery: "jquery",    "window.jQuery": "jquery"}))new webpack.NoErrorsPlugin(),new webpack.optimize.DedupePlugin(),new webpack.optimize.UglifyJsPlugin(),new webpack.optimize.CommonsChunkPlugin('common.js')

作用: 和上面5个一一对应

  把一些需要的东西绑定到window上,暴露出来 成为全局变量  不显示错误插件  具体不是太清楚,先记录着  丑化js 混淆代码而用  提取公共代码的插件

二、一个完整的栗子

'use strict';// Modulesvar webpack = require('webpack');var autoprefixer = require('autoprefixer');var HtmlWebpackPlugin = require('html-webpack-plugin');var ExtractTextPlugin = require('extract-text-webpack-plugin');var CopyWebpackPlugin = require('copy-webpack-plugin');/** * Env * Get npm lifecycle event to identify the environment */var ENV = process.env.npm_lifecycle_event;var isTest = ENV === 'test' || ENV === 'test-watch';var isProd = ENV === 'build';module.exports = function makeWebpackConfig() {    var config = {};    config.entry = isTest ? {} : {        app: './src/app/app.js'    };    config.output = isTest ? {} : {        // Absolute output directory        path: __dirname + '/dist',        publicPath: isProd ? '/' : 'http://localhost:8080/',        filename: isProd ? '[name].[hash].js' : '[name].bundle.js',        chunkFilename: isProd ? '[name].[hash].js' : '[name].bundle.js'    };    if (isTest) {        config.devtool = 'inline-source-map';    } else if (isProd) {        config.devtool = 'source-map';    } else {        config.devtool = 'eval-source-map';    }    config.module = {        preLoaders: [],        loaders: [{            test: //.js$/,            loader: 'babel',            exclude: /node_modules/        }, {            test: //.css/,            loader: isTest ? 'null' : ExtractTextPlugin.extract('style', 'css?sourceMap!postcss')        }, {            test: //.(png|jpg|jpeg|gif|svg|woff|woff2|ttf|eot)$/,            loader: 'file'        }, {            test: //.json$/,            loader: 'json'        }, {            test: //.scss/,            loader: 'style!css!sass'        }, {            test: //.html$/,            loader: 'raw'        }]    };    if (isTest) {        config.module.preLoaders.push({            test: //.js$/,            exclude: [                /node_modules/,                //.spec/.js$/            ],            loader: 'isparta-instrumenter'        })    }    config.postcss = [        autoprefixer({            browsers: ['last 2 version']        })    ];    config.plugins = [];    if (!isTest) {        config.plugins.push(            new HtmlWebpackPlugin({                template: './src/public/index.html',                inject: 'body'            }),            new ExtractTextPlugin('[name].[hash].css', {disable: !isProd})        )    }    if (isProd) {        config.plugins.push(            new webpack.NoErrorsPlugin(),            new webpack.optimize.DedupePlugin(),            new webpack.optimize.UglifyJsPlugin(),            new CopyWebpackPlugin([{                from: __dirname + '/src/public'            }]),            new webpack.ProvidePlugin({                $: "jquery",                jQuery: "jquery",                "window.jQuery": "jquery"            }))    }    config.devServer = {        contentBase: './src/public',        stats: 'minimal'    };    return config;}();

三、调试技巧

if (isTest) {    config.devtool = 'inline-source-map';} else if (isProd) {    config.devtool = 'source-map';} else {    config.devtool = 'eval-source-map';}

作用: 使用source-map可以在debug的时候看到源代码,方便 查错

tags: webpack

category: webpack插件

上一篇博客讲解了webpack环境的基本,这一篇讲解一些更深入的内容和开发技巧。基本环境搭建就不展开讲了

一、插件篇

1. 自动补全css3前缀

autoprefixer

立即学习前端免费学习笔记(深入)”;

官方是这样说的: Parse CSS and add vendor prefixes to CSS rules using values from the Can I Use website

,也就是说它是一个自动检测兼容性给各个浏览器加个内核前缀的插件。

举个栗子:最新的弹性盒模型flux实际代码:

:fullscreen a {    display: flex}

插件自动补充后

a {    display: -webkit-box;    display: -webkit-flex;    display: -ms-flexbox;    display: flex}

效果显而易见,我们可以更专注于css布局和美化,而不需要花过多的精力都写相同的外码而加上不同的前缀,也减少了冗余代码。

使用方法:

cnpm install --save-dev autoprefixer postcss-loader

var autoprefixer = require('autoprefixer');module.exports={  //其他配置这里就不写了  module:{    loaders:[    {      test://.css$/,      //在原有基础上加上一个postcss的loader就可以了      loaders:['style-loader','css-loader','postcss-loader']      }      ]  },  postcss:[autoprefixer({browsers:['last 2 versions']})]}

2. 自动生成html插件

html-webpack-plugin

cnpm install html-webpack-plugin --save-dev

  //webpack.config.js  var HtmlWebpackPlugin = require('html-webpack-plugin');  module.exports={    entry:'./index.js',    output:{      path:__dirname+'/dist',      filename:'bundle.js'    }    plugins:[      new HtmlWebpackPlugin()    ]  }

作用:它会在dist目录下自动生成一个index.html

<!DOCTYPE html><html>  <head>    <meta charset="UTF-8">    <title>Webpack App</title>  </head>  <body>    <script src="bundle.js"></script>  </body></html>

其他配置参数:

{  entry: 'index.js',  output: {    path: 'dist',    filename: 'bundle.js'  },  plugins: [    new HtmlWebpackPlugin({      title: 'My App',      filename: 'admin.html',      template:'header.html',      inject: 'body',      favicon:'./images/favico.ico',      minify:true,      hash:true,      cache:false,      showErrors:false,      "chunks": {      "head": {        "entry": "assets/head_bundle.js",        "css": [ "main.css" ]      },      xhtml:false    })  ]}
--- header.html ---<!DOCTYPE html><html>  <head>    <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>    <title><%= htmlWebpackPlugin.options.title %></title>  </head>  <body>  </body></html>

作用:

  title: 设置title的名字     filename: 设置这个html的文件名     template:要使用的模块的路径    inject: 把模板注入到哪个标签后 'body',     favicon: 给html添加一个favicon  './images/favico.ico',     minify:是否压缩  true false     hash:是否hash化 true false ,       cache:是否缓存,     showErrors:是否显示错误,    chunks:目前没太明白    xhtml:是否自动毕业标签 默认false  

3. 提取样式插件

extract-text-webpack-plugin

官网是这么解释的 Extract text from bundle into a file. ,把额外的数据加到编译好的文件中

var ExtractTextPlugin = require("extract-text-webpack-plugin");module.exports = {    module: {        loaders: [            { test: //.css$/, loader: ExtractTextPlugin.extract("style-loader", "css-loader") }        ]    },    plugins: [        new HtmlWebpackPlugin({                template: './src/public/index.html',                inject: 'body'            }),        new ExtractTextPlugin("[name].[hash].css")    ]}

说明:将css放到index.html的body上面

4. 拷贝资源插件

copy-webpack-plugin

官方这样解释 Copy files and directories in webpack ,在webpack中拷贝文件和文件夹

cnpm install --save-dev copy-webpack-pluginnew CopyWebpackPlugin([{    from: __dirname + '/src/public'}]),

作用:把public 里面的内容全部拷贝到编译目录

参数 作用 其他说明
from 定义要拷贝的源目录 from: __dirname + ‘/src/public’
to 定义要烤盘膛的目标目录 from: __dirname + ‘/dist’
toType file 或者 dir 可选,默认是文件
force 强制覆盖先前的插件 可选 默认false
context 不知道作用 可选 默认 base context 可用 specific context
flatten 只拷贝文件不管文件夹 默认是false
ignore 忽略拷贝指定的文件 可以用模糊匹配

5. 全局挂载插件

webpack.ProvidePlugin [webpack内置插件 ]

new webpack.ProvidePlugin({    $: "jquery",    jQuery: "jquery",    "window.jQuery": "jquery"}))new webpack.NoErrorsPlugin(),new webpack.optimize.DedupePlugin(),new webpack.optimize.UglifyJsPlugin(),new webpack.optimize.CommonsChunkPlugin('common.js')

作用: 和上面5个一一对应

  把一些需要的东西绑定到window上,暴露出来 成为全局变量  不显示错误插件  具体不是太清楚,先记录着  丑化js 混淆代码而用  提取公共代码的插件

二、一个完整的栗子

'use strict';// Modulesvar webpack = require('webpack');var autoprefixer = require('autoprefixer');var HtmlWebpackPlugin = require('html-webpack-plugin');var ExtractTextPlugin = require('extract-text-webpack-plugin');var CopyWebpackPlugin = require('copy-webpack-plugin');/** * Env * Get npm lifecycle event to identify the environment */var ENV = process.env.npm_lifecycle_event;var isTest = ENV === 'test' || ENV === 'test-watch';var isProd = ENV === 'build';module.exports = function makeWebpackConfig() {    var config = {};    config.entry = isTest ? {} : {        app: './src/app/app.js'    };    config.output = isTest ? {} : {        // Absolute output directory        path: __dirname + '/dist',        publicPath: isProd ? '/' : 'http://localhost:8080/',        filename: isProd ? '[name].[hash].js' : '[name].bundle.js',        chunkFilename: isProd ? '[name].[hash].js' : '[name].bundle.js'    };    if (isTest) {        config.devtool = 'inline-source-map';    } else if (isProd) {        config.devtool = 'source-map';    } else {        config.devtool = 'eval-source-map';    }    config.module = {        preLoaders: [],        loaders: [{            test: //.js$/,            loader: 'babel',            exclude: /node_modules/        }, {            test: //.css/,            loader: isTest ? 'null' : ExtractTextPlugin.extract('style', 'css?sourceMap!postcss')        }, {            test: //.(png|jpg|jpeg|gif|svg|woff|woff2|ttf|eot)$/,            loader: 'file'        }, {            test: //.json$/,            loader: 'json'        }, {            test: //.scss/,            loader: 'style!css!sass'        }, {            test: //.html$/,            loader: 'raw'        }]    };    if (isTest) {        config.module.preLoaders.push({            test: //.js$/,            exclude: [                /node_modules/,                //.spec/.js$/            ],            loader: 'isparta-instrumenter'        })    }    config.postcss = [        autoprefixer({            browsers: ['last 2 version']        })    ];    config.plugins = [];    if (!isTest) {        config.plugins.push(            new HtmlWebpackPlugin({                template: './src/public/index.html',                inject: 'body'            }),            new ExtractTextPlugin('[name].[hash].css', {disable: !isProd})        )    }    if (isProd) {        config.plugins.push(            new webpack.NoErrorsPlugin(),            new webpack.optimize.DedupePlugin(),            new webpack.optimize.UglifyJsPlugin(),            new CopyWebpackPlugin([{                from: __dirname + '/src/public'            }]),            new webpack.ProvidePlugin({                $: "jquery",                jQuery: "jquery",                "window.jQuery": "jquery"            }))    }    config.devServer = {        contentBase: './src/public',        stats: 'minimal'    };    return config;}();

三、调试技巧

if (isTest) {    config.devtool = 'inline-source-map';} else if (isProd) {    config.devtool = 'source-map';} else {    config.devtool = 'eval-source-map';}

作用: 使用source-map可以在debug的时候看到源代码,方便 查错

相关文章

HTML速学教程(入门课程)
HTML速学教程(入门课程)

HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

928

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

307

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

183

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

29

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

103

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

54

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

17

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

764

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

92

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
麦子学院bootstrap入门视频教程
麦子学院bootstrap入门视频教程

共32课时 | 9.4万人学习

尚观Linux进阶视频教程
尚观Linux进阶视频教程

共13课时 | 2.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号