开始学习Webpack-应用TypeScript,配置热加载(HMR)和Source Map

Posted 前端手艺人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开始学习Webpack-应用TypeScript,配置热加载(HMR)和Source Map相关的知识,希望对你有一定的参考价值。

当前浏览器不支持播放音乐或语音,请在微信或其他浏览器中播放

项目初始化:采用TypeScript

我们的版本是:

 
   
   
 
  1. $ node --version

  2. v8.5.0

  3. $ npm --version

  4. 5.5.1

npm版本升级了,因为npm最近带来了新特性,本地会生成package-lock.json,能 提高一些性能,想知道更多的,可以google一下。

创建目录初始结构:

 
   
   
 
  1. $ mkdir pickle

  2. $ cd pickle

  3. $ touch index.html

  4. $ touch index.ts

  5. $ touch webpack.config.js

初始化package.json

 
   
   
 
  1. $ npm init --force

  2. Wrote to /Users/abraham/dev/pickle/package.json:

  3. ...

--force是告诉自动采用默认配置。 安装相应的包:

 
   
   
 
  1. $ npm install --save-dev typescript ts-loader webpack http-server

  2. + typescript@2.5.2

  3. + ts-loader@2.3.7

  4. + webpack@3.6.0

  5. + http-server@0.10.0

  6. added 394 packages in 17.115s

创建tsconfig.json文件:(这里采用本地的typescript包,你也可以全局安装)

 
   
   
 
  1. $ ./node_modules/typescript/bin/tsc --init

  2. message TS6071: Successfully created a tsconfig.json file.

webpack.config.js:

 
   
   
 
  1. const path = require('path');

  2. module.exports = {

  3.  entry: './index.ts',

  4.  module: {

  5.    rules: [

  6.      {

  7.        test: /\.tsx?$/,

  8.        use: 'ts-loader',

  9.        exclude: /node_modules/

  10.      }

  11.    ]

  12.  },

  13.  resolve: {

  14.    extensions: [ ".tsx", ".ts", ".js" ]

  15.  },

  16.  output: {

  17.    filename: 'bundle.js',

  18.    path: path.resolve(__dirname, 'dist')

  19.  }

  20. };

修改pacakge.json:

 
   
   
 
  1. {

  2.  ...

  3.  "scripts": {

  4.    "test": "echo \"Error: no test specified\" && exit 1",

  5.    "build": "webpack",

  6.    "serve": "http-server"

  7.  },

  8.  ...

  9. }

然后你跑如下命令,可以看到:

 
   
   
 
  1. $ npm run build

  2. > pickle@1.0.0 build /Users/abraham/dev/pickle

  3. > webpack

  4. ts-loader: Using typescript@2.5.2 and /Users/abraham/dev/pickle/tsconfig.json

  5. Hash: 8b5d98f242aeda6844bb

  6. Version: webpack 3.6.0

  7. Time: 815ms

  8.    Asset Size Chunks Chunk Names

  9. bundle.js 2.51 kB 0 [emitted] main

  10.   [0] ./index.ts 14 bytes {0} [built]

修改index.html:

 
   
   
 
  1. <!DOCTYPE html>

  2. <html>

  3. <head>

  4.  <meta charset="utf-8">

  5.  <title>Pickle</title>

  6. </head>

  7. <body>

  8.  <h1>Welcome to Pickle</h1>

  9.  <label for="color-picker">Select a new background color</label>

  10.  <input id="color-picker" type="color" value="#2196F3">

  11.  <script defer src="dist/bundle.js"></script>

  12. </body>

  13. </html>

 
   
   
 
  1. class Pickle {

  2.  constructor(private picker: Element, private background: HTMLElement) {

  3.    picker.addEventListener('change', this.colorChange.bind(this), false);

  4.    this.background = background;

  5.  }

  6.  colorChange(event: Event): void {

  7.    // `<HTMLInputElement>` tells TypeScript what type `target` is so that it knows there is a `value` property available.

  8.    let input = <HTMLInputElement>event.target;

  9.    this.background.style.backgroundColor = input.value;

  10.  }

  11. }

  12. let picker = document.querySelector('#color-picker');

  13. // The if avoids TypeScript complaining that `picker` might be null.

  14. if (picker) {

  15.  new Pickle(picker, document.body);

  16. }

然后运行:

 
   
   
 
  1. $ npm run build

  2. ...

  3. $ npm run serve

  4. > http-server

  5. Starting up http-server, serving ./

  6. Available on:

  7.  http://127.0.0.1:8080

  8.  http://192.168.200.8:8080

  9. Hit CTRL-C to stop the server

浏览器访问:http://127.0.0.1:8080

webpack热加载配置(修改代码,自动刷新代码)

我们的package.json的script长这样:

 
   
   
 
  1. {

  2.  ...

  3.  "scripts": {

  4.    "test": "echo \"Error: no test specified\" && exit 1",

  5.    "build": "webpack",

  6.    "serve": "http-server",

  7.    "watch": "webpack --watch"

  8.  },

  9.  ...

  10. }

运行npm run watch后是这样:

 
   
   
 
  1. $ npm run watch

  2. > pickle@1.0.0 watch /Users/abraham/dev/pickle

  3. > webpack --watch

  4. Webpack is watching the files

  5. ts-loader: Using typescript@2.5.3 and /Users/abraham/dev/pickle/tsconfig.json

  6. Hash: 16fb35ccc9f9b3f14c5d

  7. Version: webpack 3.8.1

  8. Time: 957ms

  9.    Asset Size Chunks Chunk Names

  10. bundle.js 3.27 kB 0 [emitted] main

  11.   [0] ./index.ts 775 bytes {0} [built]

当然我们可以直接合并命令:

 
   
   
 
  1. {

  2.  ...

  3.  "serve": "npm run watch & http-server"

  4.  ...

  5. }

然后直接运行npm run serve就行了。Webpack会自动监听和编译我们的代码。 进一步,我们希望支持Hot Module Replacement(支持模块级别的自动刷新,而不需要刷新浏览器), 需要安装如下两个东西:

 
   
   
 
  1. $ npm install --save-dev webpack-dev-server

  2. + webpack-dev-server@2.9.2

  3. added 165 packages in 10.49s

  4. $ npm install --save-dev html-webpack-plugin

  5. + html-webpack-plugin@2.30.1

  6. added 38 packages and removed 11 packages in 4.662s

修改配置webpack.config.js:

 
   
   
 
  1. module.exports = {

  2.  ...

  3.  devServer: {

  4.    contentBase: path.resolve(__dirname, '.')

  5.    hot: true

  6.  }

  7.  ...

  8. };

依赖它们:

 
   
   
 
  1. const webpack = require('webpack');

  2. const HtmlWebpackPlugin = require('html-webpack-plugin');

  3. ...

添加插件:

 
   
   
 
  1. module.exports = {

  2.  ...

  3.  plugins: [

  4.    new HtmlWebpackPlugin({

  5.      filename: 'index.html',

  6.      template: 'index.html'

  7.    }),

  8.    new webpack.NamedModulesPlugin(),

  9.    new webpack.HotModuleReplacementPlugin()

  10.  ]

  11.  ...

  12. };

HotModuleReplacementPlugin 插件是告诉我们用热加载 NamedModulesPlugin 是用来清空编译日志的,这样只会显示我们入口文件信息。 HtmlWebpackPlugin 会把根目录的template文件(index.html),输出到dist目录的filename指定的文件名。这样webpack可以自动在index.html里面添加script标签,所以我们的index.html里面不需要:

修改package.json:

 
   
   
 
  1. {

  2.  ...

  3.  "serve": "webpack-dev-server --open"

  4.  ...

  5. }

--open告诉webpack在浏览器打开我们的页面。 运行npm run serve就行了。大功告成。

webpack支持source maps

修改tsconfig.json:、

 
   
   
 
  1. {

  2.  ...

  3.  "sourceMap": true,

  4.  ...

  5. }

修改webpack.config.js:

 
   
   
 
  1. module.exports = {

  2.  ...

  3.  devtool: 'eval-source-map'

  4. };

以上就是今天的内容,不知道你学会了webpack配置,TypeScript会用了吗? 欢迎留言交流。感谢阅读。

点击阅读原文,查看原文。


以上是关于开始学习Webpack-应用TypeScript,配置热加载(HMR)和Source Map的主要内容,如果未能解决你的问题,请参考以下文章

如何部署我的 Angular 2 + Typescript + Webpack 应用程序

从0开始的TypeScriptの五:webpack打包typescript

从0开始的TypeScriptの五:webpack打包typescript

Webpack 开发服务器 + React + Typescript 在源更改后不会注入资产

从0开始的TypeScriptの六:webpack5热更新打包TS

从0开始的TypeScriptの六:webpack5热更新打包TS