webpack基础

1.项目搭建、依赖模块安装、package.json配置
安装
mkdir webpack-demo && cd webpack-demo
npm init -y
 
 
npm init -y会在当前目录下生成webpack初始化package.json内容如下:
{
  "name": "webpack",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
 
 
 
安装webpack模块和lodash模块
npm install --save package
npm install --save lodash
 
安装成功后会在当前目录生成node_modules文件夹,存储依赖模块代码,另外可通过./node_modules/.bin/webpack来执行webpack
lodash是一个基础类库,提供各种数据类型的处理工具类。
创建测试代码:
dist
    --index.html
src
    --index.js
 
 
 
编辑测试代码:
//index.js
import _ from 'lodash'

function component() {
  var element = document.createElement('div');
  element.innerHTML = _.join(['Hello', 'webpack'], ' ');
  return element;
}
document.body.appendChild(component());

//index.html
<html>
  <head>
    <title>Getting Started</title>
  </head>
  <body>
    // <script src="./src/index.js"></script>
    <script src="bundle.js"></script>
    // 后面我们会通过webpack将index.js打成bundle.js
  </body>
</html>
 
 
执行./node_modules/.bin/webpack src/index.js dist/bundle.js
也可通过配置文件启动webpack,在跟目录创建webpack.config.js,内容如下:
const path = require('path');

module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist')
  }
};

//  执行./node_modules/.bin/webpack --config webpack.config.js
 
 
 
也可在package.json添加如下代码:
"scripts": {
    "build": "webpack"
    "build": "webpack --config webpack.config.js"
}

// 执行:npm run build
// npm run build会在根目录寻找webpack.config.js(经过测试是这样的!)
// 也可通过第二种指定配置文件
 
 
2.资源管理为我们项目添加加载模块
  • css加载器
npm install --save-dev style-loader css-loader xml-loader    // 安装模块到dev
 
 
    在webpack.config.js添加以下配置项
   module: {
     rules: [
       {
         test: /\.css$/,
         use: [
           'style-loader',
           'css-loader'
         ]
       },
       {
         test: /\.(png|svg|jpg|gif)$/,
         use: [
           'file-loader'
         ]
       },
       {
         test: /\.(woff|woff2|eot|ttf|otf)$/,
         use: [
           'file-loader'
         ]
       },
       {
         test: /\.(csv|tsv)$/,
         use: [
           'csv-loader'
         ]
       },
       {
         test: /\.xml$/,
         use: [
           'xml-loader'
         ]
       }
     ]
   }
 
 
  • 在index.js中可以通过import的方式引入文件
import _ from 'lodash';
import './style.css';
import Icon from './icon.png';
import Data from './data.xml';

function component() {
  var element = document.createElement('div');

  // Lodash,现在通过 script 标签导入
  element.innerHTML = _.join(['Hello', 'webpack'], ' ');
  element.classList.add('hello');

  // 将图像添加到我们已有的 div 中。
  var myIcon = new Image();
  myIcon.src = Icon;

  element.appendChild(myIcon);
  // data.xml --> <name>lllin</name>
  console.log(Data); // Data.name = 'lllin'

  return element;
}

document.body.appendChild(component());
 
 
3.打包多个模块
我们在index.js同级目录创建另一个print.js文件,然后打包两个文件。
修改webpack.config.js配置项:
entry: {
  index: './src/index.js',
  print: './src/print.js'
},
output: {
  filename: '[name].bundle.js',
  path: path.resolve(__dirname, 'dist')
},
// [name]的值为index/print
// npm run build会生成两个文件:index.bundle.js、print.bundle.js
 
 
按照前面我们需要在index.html手动引入这两个文件,但在实际项目中我们不知道最终会生成哪些js,所以这种方法是不可取的。htmlwebpackplugin插件,会帮助我们动态引入生成的js到html文件中。安装过程略过,使用方法在webpack.config.js中添加配置:
// 引入html-webpack-plugin模块
const htmlwebpackplugin = require('html-webpack-plugin') 

// 添加配置项plugins
plugins: [
   new htmlwebpackplugin({
     title: 'output management'
   })
],
 
如果这次打了三个js文件a.js b.js c.js,而下次只打出来了a.js b.js,这两个文件会同名覆盖,但c.js会仍然存在,我们可以引入插件clean-webpack-plugin,在每次打包时先删除dist文件下的所有文件。
const CleanWebpackPlugin = require('clean-webpack-plugin')
plugins: [
    new CleanWebpackPlugin(['dist'])
]
 
 
4.代码反向映射、观察者模式
在webpack打包后的程序,如果运行过程中js报错,定位错误位置时看到的是混淆过的代码,我们可以在webpack.config.js添加以下配置项,当我们点击错误信息时就可以反向映射到我们的源码,当然在生产版本中是不允许的。
devtool: 'inline-source-map'
 
目前我们每次修改代码后需要重新执行npm run build,我们可以通过观察者模式启动我们的项目:
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "webpack",
    "watch": "webpack --watch"
  },
// 当通过webpack --watch即npm run watch启动时,webapck会实时监听代码变化更新到dist文件夹下对应的文件中
 
 
 
此时我们已经可以不用反复执行npm run build,但会发现每次修改代码必须刷新浏览器更新的代码才能生效,我们可以引入另一个插件webpack-dev-server,安装过程略。在webpack.config.js添加以下配置,无需引入模块。
    devServer: {
      contentBase: './dist'
    }
 
在package.json script添加启动方式:
"start": "webpack-dev-server --open"
 
npm run start即可。
webpack-dev-middleware是webpack-dev-server的一部分,可以单独提取出来并配合express使用,相比webpack-dev-server可以更灵活。
安装
npm install --save-dev express webpack-dev-middleware
 
新增server.js文件
const express = require('express');
const webpack = require('webpack');
const webpackDevMiddleware = require('webpack-dev-middleware');

const app = express();
const config = require('./webpack.config.js');
const compiler = webpack(config);

// Tell express to use the webpack-dev-middleware and use the webpack.config.js
// configuration file as a base.
app.use(webpackDevMiddleware(compiler, {
  publicPath: config.output.publicPath  // 在webpack.config.js的outupt新增publicPath: '/'
}));

// Serve the files on port 3000.
app.listen(3000, function () {
  console.log('Example app listening on port 3000!\n');
});
 
在package.json的script新增启动方式"server": "node server.js"
通过npm run server即可。

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

posted @ 2018-01-02 14:35  Acmen、L  阅读(308)  评论(0编辑  收藏  举报