手记

入门webpack,入门webpack,入门webpack,

什么是webpack,为什么要使用webpack

我们实现功能丰富的应用,拥有复杂的js代码和一大堆依赖包,模块化,less等css预处理
这些改进确实大大提供了我们开发效率,但是利用他们的开发的文件我们需要额外的处理才能让浏览器识别,手动处理非常复杂,这就为webpack类的工具提供了需求;

1、什么是webpack?
webpack可以看做模块打包机,它做的事情是分析你的项目结构,找到js模块和预设的css,打包为合适的格式以供浏览器使用;

webpack的工作方式是:把你的项目当做一个整体,通过一个给定的主文件(main.js),
webpack将冲这个文件中找到这个项目的所有依赖文件,使用loaders处理它们,最后打包为一个浏览器能识别的JavaScript文件;

2、开始使用webpack

安装:
npm install webpack -g
npm install webpack --save-dev //安装到你的项目中

更快捷的执行打包任务:
对其配置可以使用简单的npm start命令来代替,在package.json中对npm的脚本进行
设置如下:
{
    “name”:“”,
     “scripts”:{
        “start”:“webpack”相当于npm start命令执行npm webpack命令
    }
}
在package.json中的脚本部分已经默认在命前面添加了node_modules/.bin路径,
所以无论全局是否安装webpack,在终端都不需要在前面添加详细的路径;

npm的start是一个特殊的脚本名称,在命令行中可以直接使用npm start;
如果你在scripts中配置的不是start,想要在命令行中执行,需要用npm run {scripts name}
比如你配置的是build,需执行命令  npm run bulid;

3、webpack的强大功能
生成 source maps(便于调试)

打包后的文件我们是不容易找到出错地方的,使用source maps帮我们解决此问题;
通过配置,webpack在打包的时候可以为我们生成 source maps,为我们提供一个
对应编译文件和源文件的方法,使编译后的代码可读性高,便于调试;

在webpack的配置文件中配置source maps,需要配置devtool,他有四中不同的配置选项;如下:
在学习阶段以及小到中性的项目上,eval-source-map使用还是比较好的,
但是只能在开发阶段使用它,配置如下
devtool: "eval-source-map"

4、使用webpack构建本地服务器:
浏览器检测代码修改,浏览器时时刷新,webpack提供了一个可选的本地开发服务器;
这个本地服务器基于nodejs构建, 它是一个单独的组件,
在webpack中进行配置之前需要单独安装它作为项目的依赖;
npm install webpack-dev-server --save-dev

webpack 中devserver配置选项
contentBase:默认webpack-dev-server依赖包为为根文件提供本地服务器,如果想为另外一个目录下的文件提供本地服务器,应其在这里设置(设置到public目录下);
port:设置默认监听端口,如果省略,默认是8080
inline:设置为true,当源文件修改时会自动刷新页面;
colors:设置为true,使终端输出的文件为彩色的;
historyApiFallback :在开发单页面应用非常有用,它依赖于html5 history api,设置未true,所有的跳转将指向index.html;

devServer: {
        contentBase: './public',//温蒂服务器所加载页面的目录;
        colors: true,//终端输入结果为彩色
        inline: true//实时刷新
    }

5.loaders:webpack打包处理器

loaders是webpack激动人心的功能,通过使用不同的loader,webpack通过调用调用外部的脚本或者工具可以对各种各样的文件进行处理,比如说分析json文件并把ta转化为js文件,或者把下一代js文件(es6,es7)转化为现代浏览器可以识别的js文件,或者说对react开发而言,合适的loaders可以把react的jsx文件转化为js文件;

loaders需要单独安装并且自webpack.config.js 下的module关键字进行配置,loadeers的配置选项包括如下:
test:一个匹配loaders处理的文件正在表达式;(必须)
loader:loader的名称(必须)
include/exclude 手动添加必须处理的文件(文件夹)/屏蔽不需要处理文件或者文件夹(可选);
query:为loaders提供额外的设置选项(可选);

loaders很好,不过有点loaders使用起来比较复杂,不如说babel;

5.1  babel

babel其实是一个编译JavaScript的平台,它的强大之处是通过编译达到以下目的:
--处理JavaScript的es6,es7,被浏览器所识别;
--使用基于JavaScript,处理react的jsx;

babel的安装和配置:
babel是几个模块的包,其核心位于称为babel-core的npm包中,不过webpack把他们整合在一起使用,但是对于每一个你单独使用的功能和扩展,你需要单独安装包(比如用的比较多的解析es6的babel-preset-es2015包和解析react的jsx的babel-preset-react包)

我们可以一次性安装多个依赖的模块,之间用空格隔开:
npm install babel-core babel-loader babel-preset-es2015 babel-preset-react
module: {
    loaders: [
      {
        test: /\.json$/,
        loader: "json"
      },
      {
        test: /\.js$/,
        exclude: /node_modules/,
        loader: 'babel',//在webpack的module部分的loaders里进行配置即可
        query: {
          presets: ['es2015','react']
        }
      }
    ]
  },

配置好webpack现在就可以运行使用es6和jsx的语法了,用上面的进行测试,要使用react,必须先安装react和react-dom;

6.一切皆为模块:
webpack有一个不可不说的优点,它把所有的文件都可以当做模块处理,包括你的JavaScript文件,
css,fonts以及图片都可以通过合理的loaders进行模块化处理;

7. css

webpack提供两个工具处理样式表,css-loader和style-loader,两者任务不同,css-loader使你能够使用类似@import和url的方法实现require的功能,style-loader将所有计算后的样式加入页面,两者使用让你把样式嵌套于到webpack打包后的js文件中;
安装:
npm install css-loader style-loader  --save-dev

通常的情况下。css和js会打包到一个文件中,css并不会打包为一个独立css文件,不过可以通过合适的webpack配置也可以把css打包一个单独的文件;

7.1 css  预处理器
css的处理平台postcss,他可以帮助你你的css实现更多的功能;

如何使用PostCss,我们使用postcss为css代码处理自动添加适应不同浏览器的css前缀;
首先安装postcss-loader和autoprefixer(自动添加前缀的插件)

npm install  postcss-loader  autoprefixer

在webapck配置文件中进行配置,只需要新建一个postcss关键字。并在里面申明依赖的插件,

 postcss: [
    require('autoprefixer')//调用autoprefixer插件
  ],
到现在,本文已经涉及到处理js的babel和处理css的postcss,他们是两个单独的平台,

8. plugins (插件)
plugins是用来扩展webpack功能的,他会在整个构建过程生效;

loaders和plugins区别:
loaders是webapck进行打包构建过程中对源文件(css,js,jsx,less)进行处理,一次处理一个,
plugins并不是直接操作单个文件,它直接对整个构建过程起作用;

使用插件的方法:
要是用摸个插件,我们需要用npm install 安装它,然后要做的就是webpack配置中的plugins关键字中添加插件的一个实例(plugins是一个数组),下面例子,我们添加了一个实现版权声明的插件

 plugins: [
    new webpack.BannerPlugin("Copyright Flying Unicorns inc.")//在这个数组中new一个就可以了
  ],

8.1 几个常用的插件
  --- HtmlWebpackPlugin:
       这个插件的作用是依据一个简单的模板,帮你生成最终的h5文件,这个文件中自动引用了你打包后的
       js文件,每次编译都在文件名插入一个不同的哈希值;
       npm instal --save-dev  html-webpack-plugin
      这个插件完成了我们之前手动完成的一些事情,

  ---  Hot Module Replacement

webpack配置文件

// 常见的webpack配置文件
var webpack = require('webpack');
var htmlWebPlugin = require('html-webpack-plugin');
var ExtractTextPlugin = require('extract-text-webpack-plugin');

module.exports = {
  entry: __dirname+ '/app/main.js',
  output: {
     path: __dirname+'/bulid.js',
     filename: '[name]-[hash]..js'
  },
  module: {
   loaders: [
    {
      test: /\.json$/,
      loader: 'json'
    },
    {
        test: /\.js$/,
        exclude:/node_modules/,
        loader: 'babel'
    },
    {
        test: /\.css/,
        loader: ExtractTextPlugin.extract('style', 'css?modules!postcss')
    }]
  },
  postcss: [
    require('autoprefixer')
   ],
plugins: [
    new HtmlWebpackPlugin({
      template: __dirname + "/app/index.tmpl.html"
    }),
    new webpack.optimize.OccurenceOrderPlugin(),
    new webpack.optimize.UglifyJsPlugin(),
    new ExtractTextPlugin("[name]-[hash].css")
  ]
}
18人推荐
随时随地看视频
慕课网APP

热门评论

http://webpack.wuhaolin.cn《深入浅出 Webpack》 是国内第一本系统全面讲解 Webpack 的图书,涵盖了 Webpack 的入门、配置、实战、优化、原理。

查看全部评论