/*
* 请使用最新版本nodejs
* 默认配置,是按生产环境的要求设置,也就是使用 webpack -p 命令就可以生成正式上线版本。
* 也可以使用 webpack -d -w 命令,生成用于开发调试的代码。
* 通常开发使用 node server.dev.js 命令 , server.dev.js基于此配置做了特殊处理, 主要是为了自动刷新和热更新, 这个服务只是在内存中生成缓存文件,不会在硬盘中生成文件。
* webpack配置,如果出现问题,通常都是路径问题造成的
*
* 常用命令看package.json中配置的scripts,比如
* "scripts": {
* "d": "node server.dev.js",
* "reset:dist": "rm -fr dist && mkdir -p dist/build && cp -r src/lib dist",
* "p": "npm run reset:dist && ./node_modules/.bin/webpack -p --display-error-details --progress --colors"
* }
*/ //导入Node.js的path模块,主要用来转换成绝对路径,比如path.resolve(__dirname, 'build')
const path = require('path'); //导入webpack整个模块
//也可以不导入webpack整个模块,而值导入用到的内置插件模块
//比如 var CommonsChunkPlugin = require("webpack/lib/optimize/CommonsChunkPlugin");
//这样后面使用方式为 new CommonsChunkPlugin
//否则为new webpack.optimize.CommonsChunkPlugin
const webpack = require('webpack'); //导入ExtractTextPlugin插件,作用提取代码中的css生成独立的CSS文件
const ExtractTextPlugin = require('extract-text-webpack-plugin'); //导入HtmlWebpackPlugin插件,作用按需求生成html页面,想用好,挺麻烦的,可以不用
const HtmlWebpackPlugin = require('html-webpack-plugin'); //打包配置 webpack配置,多数同时支持String, Array or Object的写法。单字符串的形式用于简单情况,key-value对象的形式用于复杂情况。
const config = { // 入口文件配置,打包输出的来源
// 多种写法 entry:'entry.js' or entry:{entry1:'entry1.js'} or entry:{entry1:['entry1a.js', ...]} or etc.
// 通常用path.resolve(__dirname, 'src/entry.js')转换成绝对路径,也可以使用相对路径,比如 './src/entry.js'
entry: {
index: [path.resolve(__dirname, 'src/index.js')],
edit: [path.resolve(__dirname, 'src/edit.js')]
}, //输出配置
//path 输出目录 通常用path.resolve(__dirname, 'build')转换成绝对路径,也可以使用相对路径,比如 './build'
//publicPath 开发代码中url的转换拼接处理,通常是代码中各种资源的地址,比如图片等, url目录前缀或完整网址url前缀'http://cdn.com/'
//filename 输出js文件名,[name]对应entry对象键名,也可以指定名字,加上id和hash可以避免缓存问题,webpack会用实际值替换类似[hash]这样字符串
output: {
path: path.resolve(__dirname, 'dist/build'),
publicPath: './build/',
filename: '[name].[id].[hash].js', }, //路径解析配置
resolve: {
//自行补全路径中文件的后缀, 第一个是空字符串,对应不需要后缀的情况
extensions: ['', '.webpack.js', '.web.js', '.js', '.jsx']
}, //模块
module: {
//loaders: 加载器
// [
// {
// test:正则表达式,匹配的文件名则使用这个加载器。
// include: 匹配的目录则进一步处理
// exclude: 匹配的目录则排除
// loader: `!`用于分隔loader 字符串形式,作用和数组形式一样
// loaders: ['loader',...] 数组形式,作用和字符串形式一样
// }
// ]
//
// 如果同一文件需要多个loaders处理,也就是使用loaders: ['loader',...] 数组形式,loader的参数不能使用query:{}写法了。只能用拼接字符串写法。
loaders: [
{
//加载css资源,默认写法loader:'style-loader!css-loader' css为Internal内部形式
//ExtractTextPlugin插件写法用于生成独立的css文件,用于external link形式
//生成的独立CSS文件中的url图片地址的publicPath,通常JS中的publicPath不一样,如果一样可以不设置
test: /\.css$/,
loader: ExtractTextPlugin.extract(
'style-loader',
'css-loader',
{
publicPath: "./"
}
)
},
{
//url-loader处理图片URL,如果图片小于limit值直接生成`base64` 格式的`dataUrl`,否则输出图片,name参数指定输出目录和图片名
//url-loader依赖file-loader
//image-webpack-loader是用来压缩图片的,主要是透明PNG
test: /\.(jpe?g|png|gif|svg)$/i,
loaders: [
'url-loader?limit=8192&name=img/[name].[hash].[ext]',
'image-webpack-loader?{progressive:true, optimizationLevel: 7, interlaced: false, pngquant:{quality: "65-90", speed: 4}}'
]
},
{
//用babel转码器加载有es2015和jsx语法的js,输出为es5语法的js,注意这里只是语法转码。
//如果开发代码中有用到新ES规范中的新对象或属性方法还需要babel-polyfill才能转码成ES5代码
//class-properties和object-rest-spread,是转码类属性写法和非数组对象的延展符...,新React常用到的写法,但还不是ES2015规范
//query对象和.babelrc配置文件内容一致,必须都写,不然使用webpack的babel-loader会报错.
test: /\.jsx?$/,
exclude: /(node_modules|lib)/,
loader: 'babel-loader',
query: {
presets: ['es2015', 'react'],
plugins: ['transform-class-properties', 'transform-object-rest-spread']
}
} ]
}, //script引入js类库,通过require或import的方式来使用,却不希望webpack把它编译到输出文件中。
//比如不想这么用 const $ = window.jQuery 而是这么用 const $ = require("jquery") or import $ from "jquery"; 则配置"jquery": "jQuery"
//键名是require或from时的字符串,键值是js内的全局变量名
externals: {
'react': 'React',
'react-dom': 'ReactDOM',
'baidu-hmt': 'window._hmt',
'lrz': 'lrz',
'iscroll': 'IScroll',
'zepto': 'Zepto',
'fabric': 'fabric',
'react-slick': 'Slider'
}, plugins: [
//输出独立的css文件,用于external link形式,如果有多个入口JS共用的CSS,会生成commons.css
new ExtractTextPlugin('[name].[id].[hash].css'), //把entry中配置的多个js中共用代码提取生成为单个js, 多参数写法 new webpack.optimize.CommonsChunkPlugin("commons", "commons.js")
new webpack.optimize.CommonsChunkPlugin({
name: "commons",
filename: "commons.[id].[hash].js"
}), //按需求生成HTML页面
//template 模板位置
//inject: 'body' js插入在body元素内部的最后
//chunks 对应入口文件名
//filename 生成的文件名,可以带上路径
//options参数对象的值可以自定义,比如这里的libJS
//在模板页中可以获得和使用这些数据,可以在模板页中使用<%= JSON.stringify(htmlWebpackPlugin) %>;输出查看所有可用的数据
new HtmlWebpackPlugin({
template: 'src/template.html',
inject: 'body',
chunks: ['commons', 'index'],
filename: '../index.html',
title: '最美奥运脸',
libJS: [
//上拉下拉
'./lib/js/iscroll-lite.min.js'
]
}),
new HtmlWebpackPlugin({
template: 'src/template.html',
inject: 'body',
chunks: ['commons', 'edit'],
filename: '../edit.html',
title: '最美奥运脸',
libJS: [
//切换左右拖动
'./lib/js/react-slick.min.js',
//编辑图片
'./lib/js/fabric.min.js'
]
}) //ProvidePlugin的作用就是在开发代码内不需要require('react')或import ... from ... 也能使用React
// ,new webpack.ProvidePlugin({
// React: 'react',
// ReactDOM: 'react-dom'
// }) //压缩代码,命令行的 webpack -p 会默认使用这个插件压缩代码
// ,new webpack.optimize.UglifyJsPlugin({
// compress: {
// warnings: false
// }
// }) ] //webpack-dev-server的配置, 通常弄成独立的文件,比如server.js,
//或者使用命令行形式,比如npm scripts命令行形式,类似webpack-dev-server -d --inline --hot
//弄webpack-dev-server通常是为了自动刷新和热更新,配置麻烦
// devServer: {
// contentBase: './',
// host: 'h5.baofeng.com',
// port: 9090, //默认8080
// inline: true //监控文件变化,自动重加载整个页面
// } }; // babel-polyfill用来转换ES2015新的对象和方法,在入口数组中,babel-polyfill必须在入口文件字符串前面,并且必须在入口文件代码的第一行import或require 'babel-polyfill'
for (let prop in config.entry) {
config.entry[prop].unshift(
'babel-polyfill'
);
} module.exports = config;

Webpack配置示例和详细说明的更多相关文章

  1. Webpack 配置示例

    Webpack 作为前端构建工具,对于大型网站开发,大大提升了开发效率.要使用webpack需要先安装webpack工具: 先来看一个最简单的命令 $ webpack main.js bundle.j ...

  2. webpack配置示例

    var webpack = require('webpack'); var commonsPlugin = new webpack.optimize.CommonsChunkPlugin('commo ...

  3. 对vue中 默认的 config/index.js:配置的详细理解 -【以及webpack配置的理解】-config配置的目的都是为了服务webpack的配置,给不同的编译条件提供配置

    当我们需要和后台分离部署的时候,必须配置config/index.js: 用vue-cli 自动构建的目录里面  (环境变量及其基本变量的配置) var path = require('path') ...

  4. webpack配置这一篇就够

    最近看了一篇好文,根据这个文章重新梳理了一遍webpack打包过程,以前的一些问题也都清楚了,在这里分享一下,同时自己也做了一些小的调整 原文链接:http://www.jianshu.com/p/4 ...

  5. vue-cli脚手架中webpack配置基础文件详解

    一.前言 原文:https://segmentfault.com/a/1190000014804826 vue-cli是构建vue单页应用的脚手架,输入一串指定的命令行从而自动生成vue.js+wep ...

  6. webpack配置详解

    webpack配置详解 先点个赞吧,再挨个点下面的连接,觉得不值这个赞的回来骂我啊. Webpack傻瓜式指南(一) Webpack傻瓜指南(二)开发和部署技巧 Webpack傻瓜式指南 原生的官网详 ...

  7. vue-cli#2.0 webpack 配置分析

    目录结构: ├── README.md ├── build │ ├── build.js │ ├── check-versions.js │ ├── dev-client.js │ ├── dev-s ...

  8. 【转】android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录(原创)

    原文网址:http://www.cnblogs.com/zdz8207/archive/2012/11/27/android-ndk-install.html android 最新 NDK r8 在w ...

  9. linux下编译qt5.6.0静态库——configure配置(超详细,有每一个模块的说明)(乌合之众)

    linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...

随机推荐

  1. Android gdb 调试

    [1].终端目录设置到: proj.android[2].make文件的编译选项加上: -g -gstabs+[3].执行编译脚本: sh ./build_native.sh NDK_DEBUG=1[ ...

  2. ORA-00020: No more process state objects available故障一例

    今天公司一大早收到通知,昨天数据库数据未生成.当时查看跑批的日志,发现平常只需运行半个小时的过程,今天整整运行了7个小时(明显存在问题),导致后续数据正常时间读取失败.为了了解起因,查看了oracle ...

  3. TFS代码变更和工作项关联,为系统变更提供完美的跟踪轨迹

    TFS是微软的应用软件生命周期管理(ALM)的解决方案产品,相比我们常见的一些ALM产品,例如HP ALM, IBM Rational, Atlanssian Jira等,其最大的区别在于TFS将软件 ...

  4. java 访问sql server数据库

    控制面板--管理工具—ODBC数据源(64位)--系统DNS—添加(名称为“test”,服务器填“.”描述随意) 这里访问的数据库为AdventuerWorks 数据源配置好后可以测试一下,下面是ja ...

  5. 第30课 Qt中的文本编辑组件

    1. 3种常用的文本编辑组件的比较 单行文本支持 多行文本支持 自定义格式支持 富文本支持 QLineEdit (单行文本编辑组件) Yes No No No QPlainTextEdit (多行普通 ...

  6. VS Code

    VS Code VS Code(Visual Studio Code)是由微软研发的一款免费.开源的跨平台文本(代码)编辑器.几乎完美的编辑器. 官网:https://code.visualstudi ...

  7. Eclipse C++开发环境配置(很简洁)

    from: https://www.zybuluo.com/ghostfn1/note/303921

  8. 转: Eclipse自动提示功能

    Eclipse的一个重要功能 2011-07-29 10:20:37 标签:java eclipse editor 休闲 职场 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信 ...

  9. php一句话后门过狗姿势万千之传输层加工(1)

    写在前面:过狗相关的资料网上也是有很多,所以在我接下来的文章中,可能观点或者举例可能会与网上部分雷同,或者表述不够全面.但是我只能说,我所传达给大家的信息,是我目前所掌握或者了解的,不能保证所有人都会 ...

  10. 我的WafBypass之道

    0x00 前言  去年到现在就一直有人希望我出一篇关于waf绕过的文章,我觉得这种老生常谈的话题也没什么可写的.很多人一遇到waf就发懵,不知如何是好,能搜到的各种姿势也是然并卵.但是积累姿势的过程也 ...