实例gif图:

目录截图:

目录介绍:

dist目录(最后生成的目录,里面文件为配置webpack自动生成的):

c/:css文件夹;

i/:img文件夹;

j/:js文件夹;

src目录下(开发目录):

c/:css文件夹;

l/:less文件夹;

s/:sass文件夹;

i/:img文件夹;

j/:js文件夹;

教程开始

原始文件夹:

第一步 
在CMD生成默认package.json文件:

 npm init -y

栗子截图:

第二步

在CMD安装插件:

npm install   autoprefixer
babel-core babel-loader
babel-preset-es2015
css-loader
cssnano
extract-text-webpack-plugin
file-loader
html-webpack-plugin
img-loader
less
less-loader
node-sass
optimize-css-assets-webpack-plugin
postcss-loader
sass-loader
url-loader
webpack
webpack-dev-server --save-dev

栗子截图:(别一口气把插件全写上跑。。。。)

最终 package.json 文件:

 {
"name": "webpack-demo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"webpack": "webpack --config webpack.config.js --display-modules --progress -w -d --colors ",
"dev": " webpack-dev-server --progress --inline --hot --colors"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"autoprefixer": "^6.7.4",
"babel-core": "^6.23.1",
"babel-loader": "^6.3.2",
"babel-preset-es2015": "^6.22.0",
"css-loader": "^0.26.1",
"cssnano": "^3.10.0",
"extract-text-webpack-plugin": "^2.0.0-rc.3",
"file-loader": "^0.10.0",
"html-webpack-plugin": "^2.28.0",
"img-loader": "^1.3.1",
"less": "^2.7.2",
"less-loader": "^2.2.3",
"node-sass": "^4.5.0",
"optimize-css-assets-webpack-plugin": "^1.3.0",
"postcss-loader": "^1.3.1",
"sass-loader": "^6.0.1",
"url-loader": "^0.5.7",
"webpack": "^2.2.1",
"webpack-dev-server": "^2.4.1"
}
}

第三步

在根目录建webpack.config.js 文件并编写:

 'use strict';

 const webpack = require('webpack');  //webpack模块;
const path = require('path'); //node 路径模块;
const ExtractTextPlugin = require("extract-text-webpack-plugin"); //独立打包css模块;
const HtmlWebpackPlugin = require('html-webpack-plugin'); //html模板模块;
const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin'); //压缩CSS模块; module.exports = {
context: path.resolve(__dirname, './src/j'), //设置原始文件目录;
entry: { //打包入口;
app: './index.js', //打包js;
},
output: { //打包出口;
publicPath: "http://localhost:8080/", //配合devServer本地Server;
path: path.resolve(__dirname, './dist/'), //出口地址;
filename: 'j/[name].bundle.js', //出口文件名;
},
module: { //模块;
rules: [ //原 webpack@1 里 loaders;
{
//正则匹配后缀.js文件;
test: /\.js$/,
//需要排除的目录
exclude: '/node_modules/',
//加载babel-loader转译es6
use: [{
loader: 'babel-loader',
//配置参数;
options: { presets: ['es2015',] }
}],
},
{
//正则匹配后缀.css文件;
test: /\.css$/,
//使用html-webpack-plugin插件独立css到一个文件;
use: ExtractTextPlugin.extract({
//加载css-loader、postcss-loader(编译顺序从下往上)转译css
use: [
{
loader : 'css-loader?importLoaders=1', },
{
loader : 'postcss-loader',
//配置参数;
options: {
//从postcss插件autoprefixer 添加css3前缀;
plugins: function() {
return [
//加载autoprefixer并配置前缀,可加载更多postcss插件;
require('autoprefixer')({
browsers: ['ios >= 7.0']
})
];
}
}
}
]
})
},
{
//正则匹配后缀.sass、.scss文件;
test: /\.(sass|scss)$/,
//使用html-webpack-plugin插件独立css到一个文件;
use: ExtractTextPlugin.extract({
use: [
{
loader : 'css-loader?importLoaders=1',
},
{
loader : 'postcss-loader',
//配置参数;
options: {
plugins: function() {
return [
require('autoprefixer')({
browsers: ['ios >= 7.0']
})
];
}
}
},
{
//加载sass-loader同时也得安装node-sass;
loader: "sass-loader",
//配置参数;
options: {
//sass的sourceMap
sourceMap:true,
//输出css的格式两个常用选项:compact({}行), compressed(压缩一行)
outputStyle : 'compact'
}
}
]
})
},
{
//正则匹配后缀.less文件;
test: /\.less$/,
//使用html-webpack-plugin插件独立css到一个文件;
use: ExtractTextPlugin.extract({
use: [
{
loader : 'css-loader?importLoaders=1',
},
{
loader : 'postcss-loader',
//配置参数;
options: {
plugins: function() {
return [
require('autoprefixer')({
browsers: ['ios >= 7.0']
})
];
}
}
},
//加载less-loader同时也得安装less;
"less-loader"
]
})
},
{
//正则匹配后缀.png、.jpg、.gif图片文件;
test: /\.(png|jpg|gif)$/i,
use: [
{
//加载url-loader 同时安装 file-loader;
loader : 'url-loader',
options : {
//小于10000K的图片文件转base64到css里,当然css文件体积更大;
limit : 10000,
//设置最终img路径;
name : '/i/[name]-[hash].[ext]'
}
},
{
//压缩图片(另一个压缩图片:image-webpack-loader);
loader : 'img-loader?minimize&optimizationLevel=5&progressive=true'
}, ]
}
]
},
plugins: [ //插件;
//模板插件
new HtmlWebpackPlugin({
filename: 'index.html', //设置最后生成文件名称;
template: __dirname+'/src/index.html' //设置原文件;
}),
//独立打包css插件;
new ExtractTextPlugin({
filename : 'c/styles.css' //设置最后css路径、名称;
}),
//压缩css(注:因为没有用style-loader打包到js里所以webpack.optimize.UglifyJsPlugin的压缩本身对独立css不管用);
new OptimizeCssAssetsPlugin({
assetNameRegExp: /\.css$/g, //正则匹配后缀.css文件;
cssProcessor: require('cssnano'), //加载‘cssnano’css优化插件;
cssProcessorOptions: { discardComments: {removeAll: true } }, //插件设置,删除所有注释;
canPrint: true //设置是否可以向控制台打日志,默认为true;
}),
//webpack内置js压缩插件;
new webpack.optimize.UglifyJsPlugin({
compress: { //压缩;
warnings: false //关闭警告;
}
}),
//webpack内置自动加载插件配合resolve.alias做全局插件;
new webpack.ProvidePlugin({
$: 'jquery' //文件里遇见‘$’加载jquery;
})
],
devServer: { //设置本地Server;
contentBase: path.join(__dirname,'dist'), //设置启动文件目录;
port: 8080, //设置端口号;
compress: true, //设置gzip压缩;
//inline:true, //开启更新客户端入口(可在package.json scripts 里设置 npm run xxx);
//hot: true //设置热更新(可在package.json scripts 里设置 npm run xxx);
},
resolve:{
//设置可省略文件后缀名(注:如果有文件没有后缀设置‘’会在编译时会报错,必须改成' '中间加个空格。ps:虽然看起来很强大但有时候省略后缀真不知道加载是啥啊~);
extensions: [' ','.css','.scss','.sass','.less','.js','.json'],
//查找module的话从这里开始查找;
modules: [path.resolve(__dirname, "src"), "node_modules"], //绝对路径;
//别名设置,主要是为了配和webpack.ProvidePlugin设置全局插件;
alias: {
//设置全局jquery插件;
jquery: path.resolve(__dirname,'./src/j/jquery.min.js') //绝对路径;
}
}
};

第四步

在index.js 入口js文件 引入需要打包文件(真实项目里也不太可能less\sass\css 三个混着写,示例而已):

第五步

webpack 常用命令

 webpack 最基本的启动webpack命令
webpack -w 提供watch方法,实时进行打包更新
webpack -p 对打包后的文件进行压缩
webpack -d 提供SourceMaps,方便调试
webpack --colors 输出结果带彩色,比如:会用红色显示耗时较长的步骤
webpack --profile 输出性能数据,可以看到每一步的耗时
webpack --display-modules 默认情况下 node_modules 下的模块会被隐藏,加上这个参数可以显示这些被隐藏的模块
webpack --progress 显示编译进度
webpack-dev-server --inline 开启更新客户端入口
webpack-dev-server --hot 开启热更新

老写那么长的命令四不四撒 所以在package.json 编写 npm scripts 集成命令:

 "webpack": "webpack --config webpack.config.js --display-modules --progress -w -d --colors ",
"dev": " webpack-dev-server --progress --inline --hot --colors"

栗子截图:

第六步

CMD跑 npm run webpack 完成之后在 跑 npm run dev 启动服务:

 npm run webpack
npm run dev

栗子截图:

最后就可以打开 http://localhost:8080/ 实时更新了啦!

后记:

其实这里面有个问题我没有解决就是实时更新独立的CSS文件

因为我没有style-loader 把CSS打包到js里而是独立出一个CSS文件(不要问我为什么不用,因为不喜欢)

所以我在改src/里的css文件时 虽然webpack是检测有文件更改 但因为更改css不在js里

它就没新刷浏览器,独立的css也无法热更新,在网上找了好多文章也没看到类似的问题~

参考资料:

webpackhttp://webpack.github.io/

webpack中文指南http://webpackdoc.com/

愚人码头 : http://www.css88.com/archives/6992

qbatyhttp://www.imooc.com/learn/802

webpack2 实践的更多相关文章

  1. 使用webpack2.0 搭建react.js项目

    最近一段时间没有写react.js,发现webpack已经完全升级为2.0了,升级后导致以前的项目不能正常编译,只能重新实践一番 关于webpack2.0和1.x的区别概括起来就是tree shaki ...

  2. Web 前端从入门菜鸟到实践老司机所需要的资料与指南合集

    http://web.jobbole.com/89188/ 2016 – 对于未来五年内Web发展的7个预测 2015 – 我的前端之路:从命令式到响应式,以及组件化与工程化的变革 怎么成为一名优秀的 ...

  3. webpack 从入门到工程实践

    from:https://www.jianshu.com/p/9349c30a6b3e?utm_campaign=maleskine&utm_content=note&utm_medi ...

  4. webpack实践总结

    一.Loader写法及执行顺序 从webpack2起,loader的格式如下: module: { rules: [ {test: /\.css$/, use: ['style-loader','cs ...

  5. 一份关于webpack2和模块打包的新手指南(二)

    插件 我们已经看到一个内置的webpack插件的例子,在npm run build脚本中调用的webpack -p命令就是使用webpack附带的UglifyJsPlugin插件以生产模式压缩打包文件 ...

  6. Tree-Shaking性能优化实践 - 原理篇

    Tree-Shaking性能优化实践 - 原理篇   一. 什么是Tree-shaking 先来看一下Tree-shaking原始的本意 上图形象的解释了Tree-shaking 的本意,本文所说的前 ...

  7. webpack2诸类事宜

    写在最前:webpack的总结也是自己坑过,实践过但是也是针对性的使用,在加上webpack的背景,对于其‘原理’方面有很大的不正确的理解,有错误的地方,请尽情指出(乖巧~) 由于版本遇到的问题: 在 ...

  8. webp图片实践之路

    最近,我们在项目中实践了webp图片,并且抽离出了工具模块,整合到了项目的基础模板中.传闻IOS10也将要支持webp,那么使用webp带来的性能提升将更加明显.估计在不久的将来,webp会成为标配. ...

  9. Hangfire项目实践分享

    Hangfire项目实践分享 目录 Hangfire项目实践分享 目录 什么是Hangfire Hangfire基础 基于队列的任务处理(Fire-and-forget jobs) 延迟任务执行(De ...

随机推荐

  1. Java 关于cannot resolve symbol 'log'报错问题

    我用的是IDEA,报错的内容是:cannot resolve symbol 'log' 如图所示: 解决方法: 1.安装插件:Settings→Plugins,输入lom回车: 2.然后选择Insta ...

  2. package---包

    一,包 包(package) 用于管理程序中的类,主要用于解决类的同名问题.包可以看成目录. 包的作用: [1] 防止命名冲突. [2] 允许类组成一个单元(模块),便于管理和维护 [3] 更好的保护 ...

  3. 关于【jq插件开发】

    很详细,原文链接:https://www.cnblogs.com/Wayou/p/jquery_plugin_tutorial.html#commentform和https://www.cnblogs ...

  4. Logback日志基础配置以及自定义配置

    Logback日志基础配置 logback日志配置有很多介绍,但是有几个非常基础的,容易忽略的.下面是最简单的一个配置,注意加粗的描述 <?xml version="1.0" ...

  5. 【集训队互测2015】Robot

    题目描述 http://uoj.ac/problem/88 题解 维护两颗线段树,维护最大值和最小值,因为每次只有单点查询,所以可以直接在区间插入线段就可以了. 注意卡常,不要写STL,用链表把同类修 ...

  6. Redisson分布式锁实现

    转: Redisson分布式锁实现 2018年09月07日 15:30:32 校长我错了 阅读数:3303   转:分布式锁和Redisson实现 概述 分布式系统有一个著名的理论CAP,指在一个分布 ...

  7. 金蝶K3 wise 插件二次开发与配置

    金蝶K3 wise 插件二次开发与配置 开发环境:K/3 Wise 13.0.K/3 Bos开发平台.Visual Basic 6.0 目录 一.二次开发插件编程二.代码演示三.配置插件四.测试插件五 ...

  8. linux/ubantu 安装 mysql 并且使其支持远程连接

    前言:打开ubantu的 控制台 或者 远程连接到 ubantu的服务器  其他的 linux 基本类似 可能下载 方式稍微不同 开始吧! [第一步]首先是安装(目前是2019-4-9 默认安装的是 ...

  9. ant 执行jmeter

    构建-invoke ant -properties jmeter.home=/home/userapp/apps/apache-jmeter-5.0report.title=kyh_register_ ...

  10. ansible Templates

    Files和templates files和templates均用于ansible文件处理,两者的主要区别是:Files目录下的文件无需写绝对路径即可将文件传输到远程主机,templates目录下文件 ...