• 使用webpack打包ts代码的配置实现和相关说明


    使用 webpack打

    生成 package.json

    本质上,webpack 是一个用于现代 JavaScript 应用程序的 静态模块打包工具。在我们的项目中要使用 webpack 首先应该初始化,生成的默认的 package.json,执行 npm init -y 后会在项目根目录下生成 package.json(其中 -y 是直接略过所有问答,直接都 yes)

    安装 cnpm

    接下来需要安装 webpack 所需依赖,我们可以使用 npm 或 cnpm 安装。这里说点题外话。npm 作为包管理器,由于服务器不在国内所以有的时候速度会慢一点,所以我们来安装淘宝团队的 cnpm,这个就是 npm 在国内的镜像,执行以下命令来安装 cnpm

    npm install cnpm -g --registry=https://registry.npm.taobao.org

    使用 cnpm -v来检查是否安装成功 

    安装 webpack 相关

    cnpm i -D webpack webpack-cli typescript ts-loader

    i 是 install 的简写
    -D 表示安装到开发环境,也就是安装并将依赖信息写在 package.json 中的 devDependencies中,等同于 --save-dev
    webpack 安装打包工具的核心代码
    webpack-cli webpack 命令行工具
    typescript ts的核心包
    ts-loader 必须安装这个才能让 ts 在 webpack 中使用

    执行命令后,查看 package.json,多了 devDependencies 节点,说明安装成功啦

    编写 webpack 配置文件

    新建一个 webpack.config.js 文件到根目录 

    1. //引入一个包
    2. const path = require('path')
    3. //webpack 中的所有配置都应该写在 module.exports 中
    4. module.exports = {
    5. //指定入口文件
    6. entry: "./src/index.ts",
    7. //指定打包文件所在目录
    8. output: {
    9. //指定打包文件的目录
    10. path: path.resolve(__dirname, 'dist'),
    11. //打包后文件的名字
    12. filename: "bundle.js"
    13. },
    14. //指定webpack打包时使用的模块
    15. module: {
    16. //指定要加载的规则
    17. rules: [
    18. {
    19. //test 指定规则生效的文件,以下匹配以 ts 结尾的文件
    20. test:/\.ts$/,
    21. //要使用的loader,用 ts-loader 处理以 ts 结尾的文件
    22. use: 'ts-loader',
    23. //要排除的文件
    24. exclude: /node_modules/
    25. }
    26. ]
    27. }
    28. };

    创建 tsconfig.json

    上节我们已经讲了,先写这些:

    1. {
    2. "compilerOptions": {
    3. "module": "ES2015",
    4. "target": "ES2015",
    5. "strict": true
    6. }
    7. }

    修改 package.json

     "build": "webpack"
    

    增加位置如下:

    使用webpack打包

    命令:npm run build

    在 webpack.config.js 中我们指定了入口文件为 index.ts,我们在里边随便编写一些内容

    index.ts

    1. function sum(a:number,b:number):number{
    2. return a+b;
    3. }
    4. console.log(sum(11,22));

     在 webpack.config.js 中我们指定了打包文件的目录为 dist,打包后的文件名是 bundle.js,所以执行命令npm run build后就使用 webpack 进行了打包,结果如下:

    到此为止,我们就实现了最简单的使用 webpack 打包的功能

    安装插件

    html-webpack-plugin

    ① 安装插件
    执行 cnpm i -D html-webpack-plugin
    html-webpack-plugin 帮助我们自动生成 html 文件

    ② 引入插件
    webpack.config.js 中引入插件

    1. //引入一个包
    2. ......
    3. //引入插件
    4. const HTMLWebpackPlugin = require("html-webpack-plugin")
    5. //webpack 中的所有配置都应该写在 module.exports 中
    6. module.exports = {
    7. ......
    8. //配置webpack插件
    9. plugins: [
    10. new HTMLWebpackPlugin(),
    11. ]
    12. };

    ③打包
    先执行 npm run build

    这样目录下就生成了 html 文件

    我们可以自定义标题或其他一些内容

    1. //配置webpack插件
    2. plugins: [
    3. new HTMLWebpackPlugin({
    4. title: "自定义标题"
    5. }),
    6. ]

     还可以设置一个网页模板,我们可以在 src 下新建一个 index.html 做为模板

    然后在 webpack.config.js 中将其设置为模板

    1. plugins: [
    2. new HTMLWebpackPlugin({
    3. template: "./src/index.html"
    4. }),
    5. ]

     再次运行 npm run build 生成的网页就是根据刚才写好的模板生成的

    webpack-dev-server

    ①、执行cnpm i -D webpack-dev-server
    ②、在 pages.json 中 scripts 节点下增加 "start": "webpack serve --open"

    意思是启动 webpack 服务器,这样我们刚才生成的 html 会用默认浏览器打开

    ③、运行
    直接点击上边截图的运行三角形,或者执行 npm start

    如果报错 The mode option has not been set......

    解决办法
    在 webpack.config.js 中根节点下增加 mode: 'development'

    (如果还处在上次命令,可以按 ctrl+c 终止命令)再次执行 npm start 即可打开默认浏览器

    这个网页是实时更新的,我们修改 index.ts ,多输出一行文字,右侧浏览器也会自动输出

    clear-webpack-plugin

    这个插件的作用是每次编译会先清空编译文件夹下的文件,再生成,这样就保证了都是最新文件

    ①、安装

    cnpm i -D clean-webpack-plugin
    

    ②、引入、配置 

    1. //引入clean插件
    2. const { CleanWebpackPlugin } = require('clean-webpack-plugin')
    3. //配置webpack插件
    4. plugins: [
    5. new CleanWebpackPlugin(),
    6. ......
    7. ],

     babel

    babel 用来解决兼容性问题

    ①、安装

    cnpm i -D @babel/core @babel/preset-env babel-loader core-js

    ②、配置
    修改 webpack.config.js

    1. ......
    2. //webpack 中的所有配置都应该写在 module.exports 中
    3. module.exports = {
    4. //指定入口文件
    5. entry: "./src/index.ts",
    6. //指定打包文件所在目录
    7. output: {
    8. ......
    9. //告诉webpack不使用箭头函数
    10. environment: {
    11. arrowFunction: false
    12. }
    13. },
    14. //指定webpack打包时使用的模块
    15. module: {
    16. //指定要加载的规则
    17. rules: [
    18. {
    19. //test 指定规则生效的文件,以下匹配以 ts 结尾的文件
    20. test:/\.ts$/,
    21. //要使用的loader,用 ts-loader 处理以 ts 结尾的文件
    22. use: [
    23. //配置babel
    24. {
    25. //指定加载器
    26. loader:'babel-loader',
    27. //设置 babel
    28. options: {
    29. //设置预定义的环境
    30. presets:[
    31. //指定环境插件
    32. '@babel/preset-env'
    33. ]
    34. }
    35. },
    36. 'ts-loader'
    37. ],
    38. //要排除的文件
    39. exclude: /node_modules/
    40. }
    41. ]
    42. },
    43. ......
    44. };

    加载器的顺序是从后往前执行,所以先用 ts-loader 将 ts 转为 js,然后使用 babel-loader 将新版本的 js 转换为 旧版本的 js

    模块问题

    新建 m1.ts 暴露一个 hi

    index.ts 中引入 m1 并打印 hi

    执行 npm run build 会报错: 

    这时我们需要修改 webpack.config.js 中配置,增加

    1. resolve: {
    2. extensions: ['.ts','.js']
    3. }

    Resolve 配置 webpack 如何寻找模块对应的文件,在导入语句没带文件后缀时,webpack 会自动带上后缀去尝试访问文件是否存在。resolve.extensions 用于配置在尝试过程中用到的后缀列表

    附上所有的webpack.config.js代码:

    1. //引入一个包
    2. const HtmlWebpackPlugin = require('html-webpack-plugin');
    3. const path = require('path')
    4. const { CleanWebpackPlugin } = require('clean-webpack-plugin')
    5. const isProd = 'production' // 是否生产环境
    6. //webpack 中的所有配置都应该写在 module.exports 中
    7. module.exports = {
    8. mode: isProd ? 'production' : 'development', //模式:生产模式还是开发模式
    9. //指定入口文件
    10. entry: "./src/index.ts",
    11. //指定打包文件所在目录
    12. output: {
    13. //指定打包文件的目录
    14. path: path.resolve(__dirname, 'dist'),
    15. //打包后文件的名字
    16. filename: "bundle.js"
    17. },
    18. //指定webpack打包时使用的模块
    19. module: {
    20. //指定要加载的规则
    21. rules: [
    22. {
    23. //test 指定规则生效的文件,以下匹配以 ts 结尾的文件
    24. test: /\.ts$/,
    25. //要使用的loader,用 ts-loader 处理以 ts 结尾的文件
    26. use: [
    27. //配置babel
    28. {
    29. //指定加载器
    30. loader: 'babel-loader',
    31. //设置 babel
    32. options: {
    33. //设置预定义的环境
    34. presets: [
    35. //指定环境插件
    36. '@babel/preset-env',
    37. ]
    38. }
    39. },
    40. 'ts-loader'
    41. ],
    42. //要排除的文件
    43. exclude: /node_modules/
    44. }
    45. ]
    46. },
    47. plugins: [
    48. new HtmlWebpackPlugin({
    49. title: "自定义标题",
    50. template: "./src/index.html"
    51. }),
    52. new CleanWebpackPlugin(),
    53. ],
    54. resolve: {
    55. extensions: ['.ts', '.js']
    56. }
    57. };

  • 相关阅读:
    关于matplotlib实现词云图提出问题
    小黑子—MyBatis:第二章
    基于广播网络实验内容
    d3dx9_39.dll丢失怎么修复?d3dx9_39.dll丢失的四种修复办法分享
    一种适用于FDD+TDD基站天线阵列的多天线共存方式
    springboot 整合 dubbo 实现分组聚合
    Qt-OpenCV学习笔记--计算周长--arcLength()
    不看后悔!第一本全面详解Transformer的综合性书籍!284页pdf下载
    HTTP/HTTPS | 青训营笔记
    物联网与元宇宙融合发展
  • 原文地址:https://blog.csdn.net/weixin_44786530/article/details/126096762