草庐IT

自学 TypeScript 第四天,手把手项目搭建

六扇有伊人 2023-03-28 原文

前言:

学了三天,我们学习了 TS 的基本类型声明,TS 的编译,webpack 打包,其实也就差不多了,剩下的也就一些 类,继承,构造函数,抽象类,泛型一些的,如果都细致的讲可能写好久,感兴趣的可以自己找资料细致的去学一下

学习代码或一个新语法,最好的方法无非就是做项目,从这个过程中学会如何去使用,怎么去写

废话不多说,我们开始今天的贪吃蛇项目初始化

项目搭建,初始化:

我记得前一天,我们配置过一份 webpack 配置,直接复制过来使用,这里就不多说了,然后就是在项目中引入我们的 less

npm i -D less less-loader css-loader style-loader

什么什么杠 loader ,就是把什么和 webpack 进行一个整合

安装好我们去配置一下,之前我们的文件只对 ts 进行了一个处理,现在我们要对 less 进行一个处理,所以要在 rules 里新加一个规则对象

{
    test:/\.less$/,
} 

首先我们先用 test 指定我们的规则生效文件

            {
                test:/\.less$/,
                use:[
                    "style-loader",
                    "css-loader",
                    "less-loader"
                ]
            }

其次我们在 use 进行配置 loader 这里记住 use 的执行顺序是从下到上执行的,这里我想让它先执行 less-loader 最后执行 style-loader

配置好之后我们在less 文件中给 body 一个背景色,然后在 TS 里面 impor 一下 引入 less 文件,最后在模板 index 文件中 引用我们的 js 文件

打开 index 如果能看到你的背景色,恭喜你引用成功了

css的兼容性:

之前我们学习过 ts 的 babel 可以把代码转成其他版本的,来解决兼容性问题,而我们的 css 也就这种 ”babel“  叫 postcss

npm i -D -S postcss postcss-loader postcss-preset-env

下载成功之后,我们进行配置,而这个配置 loader 写到 less-loader 和 cssloader 之间,因为我们要在less 讲我们的代码 转换成 css 之后要立刻的处理兼容性问题

因为我们还要配置 postcss ,所以是一个对象

                    {
                        loader:'postcss-loader',
                        options:{
                            postcssOptions:{
                                plugins:[
                                    "postcss-preset-env",
                                    {
                                        browsers:'last 3 versions'
                                    }
                                ]
                            }
                        },
                    },

loader  : 指定加载器,postcss-loader

options : 详细配置里面就一个 postcssOptions 

plugins : 指定 postcssOptions 要使用的一个插件  postcss-preset-env

browsers : 设置浏览器信息,last :最新的 3 三个  versions 版本 意思就是 兼容3个版本最新的浏览器

项目初始化目录:

 

 

webpack.config.js 配置详情 在文章最下边

贪吃蛇,项目页面:

配置完成之后,接下来为们来做我们的项目页面

首先我们先打开我们的 开发服务器, npm start

启动成功之后,我们就获得了一个可实时更新的 html 页面

1,游戏主容器

第一步我们先构建我们的游戏窗口,也就是我们贪吃蛇的可视区范围

index.html 文件

    <div id="main"></div>

index.less 文件

@bg-color: #b7d4a8;

// 清楚默认
*{
    margin: 0;
    padding:0;
    // 改变盒子模型的计算方式
    box-sizing: border-box;
}
#main{
    width: 360px;
    height: 420px;
    background-color: @bg-color;
    margin: 100px auto;
    border: 10px solid black;
    border-radius: 10px;
}

2,贪吃蛇移动区域和菜单区域

设置完成我们的主容器,开始写我们的贪吃蛇移动区域和菜单区域

index.html 文件

    <!-- 创建我们的游戏的主容器 -->
    <div id="main">
        <!-- 设置我们的游戏舞台 -->
        <div id="stage">
            
        </div>
        <!-- 设置我们游戏的记分牌 -->
        <div id="score_panel">
            <div id="score">
                SCORE:<span>0</span>
            </div>
            <div id="lecel">
                LECEL:<span>1</span>
            </div>
        </div>
    </div>

index.less 文件

// 设置
@bg-color: #b7d4a8;

// 清楚默认
body{
    font: bold 20px "Courier"
}
*{
    margin: 0;
    padding:0;
    // 改变盒子模型的计算方式
    box-sizing: border-box;
}
// 设置我们的主窗口
#main{
    width: 360px;
    height: 420px;
    background-color: @bg-color;
    margin: 100px auto;
    border: 10px solid black;
    border-radius: 10px;
    // 设置弹性盒
    display: flex;
    flex-flow:column;
    align-items: center;
    justify-content: space-around;
    #stage{
        width: 304px;
        height: 304px;
        border:2px solid black;
    }
    #score_panel{
        width: 300px;
        display: flex;
        justify-content:space-between; 
    }
}

3,蛇和食物

再游戏舞台里面写,两个 div 一个是蛇,一个是食物,同一个css 只不过食物多了 top 和 left

        .snake>div{
            width: 10px;
            height: 10px;
            background-color: black;
            border: 1px solid @bg-color;
            position: absolute;
        };   
        #food{
            width: 10px;
            height: 10px;
            background-color: black;
            border: 1px solid @bg-color;
            position: absolute;
            top: 40px;
            left: 40px;
        }  

到现在位置,游戏的页面就完成了,下面是全部代码

 

 

 HTML代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>贪吃蛇项目</title>
</head>
<body>
    <!-- 创建我们的游戏的主容器 -->
    <div id="main">
        <!-- 设置我们的游戏舞台 -->
        <div id="stage">
            <!-- 设置我们的蛇 -->
            <div id="#snake" class="snake">
                <!-- 蛇的各部分 -- 长度 -->
                <div></div>
            </div>
            <!-- 食物 -->
            <div id="food">

            </div>
        </div>
        <!-- 设置我们游戏的记分牌 -->
        <div id="score_panel">
            <div id="score">
                SCORE:<span>0</span>
            </div>
            <div id="lecel">
                LECEL:<span>1</span>
            </div>
        </div>
    </div>
    <script src="./index.js"></script>
</body>
</html>

Less代码:

// 设置
@bg-color: #b7d4a8;

// 清楚默认
body{
    font: bold 20px "Courier"
}
*{
    margin: 0;
    padding:0;
    // 改变盒子模型的计算方式
    box-sizing: border-box;
}
// 设置我们的主窗口
#main{
    width: 360px;
    height: 420px;
    background-color: @bg-color;
    margin: 100px auto;
    border: 10px solid black;
    border-radius: 10px;
    // 设置弹性盒
    display: flex;
    flex-flow:column;
    align-items: center;
    justify-content: space-around;
    #stage{
        width: 304px;
        height: 304px;
        border:2px solid black;
        position: relative;
        .snake>div{
            width: 10px;
            height: 10px;
            background-color: black;
            border: 1px solid @bg-color;
            position: absolute;
        };   
        #food{
            width: 10px;
            height: 10px;
            background-color: black;
            border: 1px solid @bg-color;
            position: absolute;
            top: 40px;
            left: 40px;
        }        
    }
    #score_panel{
        width: 300px;
        display: flex;
        justify-content:space-between; 
    }
}

tsconfig.json 配置

{
    "compilerOptions":{
        "module": "ES2015",
        "target": "ES2015",
        "strict": true,
        "noEmitOnError": true,
    }
}

webpack.config.js 配置

// 引入一个包
const path = require('path'); // 用户拼接路径
// 引入 html 插件
const HTMLWebpackPlugin = require('html-webpack-plugin');
// 引入 clean 插件
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
// webpack 中所有的配置信息都应该写到我们的 module.exports 里
module.exports = {
    "mode": 'development',
    // 指定入口文件
    entry:"./src/index.ts",
    // 指定打包文件所在的目录
    output:{
        path:path.resolve(__dirname,'dist'),
        // 打包后文件的文件
        filename:"index.js"
    },
    // 指定webpack 打包时要使用的模块
    module:{
        // 指定加载的规则
        rules:[
            {
                // test 指定的是规则生效的文件
                test:/\.ts$/, // 所有以 ts 结尾的文件
                // use:'ts-loader',
                use:[
                    // 配置我们的 babel
                    {
                        //  指定我们的加载器
                        loader:"babel-loader",
                        // 配置我们的babel
                        options:{
                            // 设置预定的环境
                            presets:[
                                [
                                    // 指定我们的环境插件
                                    "@babel/preset-env",
                                    // 配置信息
                                    {
                                        // 要兼容的目标浏览器
                                        targets:{
                                            "chrome":"88",
                                            "ie":"11" // 指定浏览器的一个版本
                                        },
                                        // 指定 corejs 版本
                                        "corejs":"3", // 用那个版本的 js
                                        // 使用 corejs 的方式
                                        "useBuiltIns":"usage", // usage 按需加载
                                    }
                                ]
                            ]
                        },
                    },
                    'ts-loader',
                ],
            },
            // 设置我们 less 文件的处理
            {
                test:/\.less$/,
                use:[
                    "style-loader",
                    "css-loader",
                    // postcss
                    {
                        loader:'postcss-loader',
                        options:{  // 详细配置
                            postcssOptions:{ // 指定 postcssOptions 要使用的一个插件  postcss-preset-env
                                plugins:[
                                    [
                                        "postcss-preset-env", 
                                        {
                                            browsers:'last 3 versions' // 浏览器信息,兼容三个全新版本的浏览器
                                        }                                        
                                    ]
                                ]
                            }
                        },
                    },
                    "less-loader",
                ]
            }
        ]
    },
    // 配置 webpack 插件
    plugins:[
        new CleanWebpackPlugin(),
        new HTMLWebpackPlugin({
            template:'./src/index.html',
        })
    ],
    // 用来设置引用模块
    resolve:{
        extensions:['.ts','.js'] // 以 .ts 和 .js 结尾的都可以当模块去引用
    }
}

 

 

有关自学 TypeScript 第四天,手把手项目搭建的更多相关文章

  1. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  2. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  3. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  4. Ruby 从大范围中获取第 n 个项目 - 2

    假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit

  5. Unity 3D 制作开关门动画,旋转门制作,推拉门制作,门把手动画制作 - 2

    Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u

  6. ruby - 如何在 Ruby 字符串中插入项目符号字符? - 2

    我正在尝试创建一个带有项目符号字符的Ruby1.9.3字符串。str="•"+"helloworld"但是,当我输入它时,我收到有关非ASCII字符的语法错误。我该怎么做? 最佳答案 你可以把Unicode字符放在那里。str="\u2022"+"helloworld" 关于ruby-如何在Ruby字符串中插入项目符号字符?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1195

  7. ruby - 在 Rails 项目中测试本地版本的 gem - 2

    我的Rails站点使用了一个确实不是很好的gem。每次我需要做一些新的事情时,我最终不得不花费与向实际Rails项目添加代码一样多的时间来为gem添加功能。但我不介意,我将我的Gemfile设置为指向我的gem的GitHub分支(我尝试提交PR,但维护者似乎已经下台)。问题是我真的没有找到一种合理的方法来测试我添加到gem的新东西。在railsc中测试它会特别好,但我能想到的唯一方法是a)更改~/.rvm/gems/.../foo。rb,这看起来不对或者b)升级版本,推送到Github,然后运行​​bundleup,这除了耗时之外显然是一场灾难,因为我不确定我所做的promise是否正

  8. ruby - 合并 nanoc 中的项目 - 2

    我一直在尝试使用nanoc用于生成静态网站。我需要组织一个复杂的排列页面,我想让我的内容保持干燥。包含或合并的概念在nanoc系统中如何运作?我已阅读文档,但似乎找不到我想要的内容。例如:我如何获取两个部分内容项并将它们合并到一个新的内容项中。在staticmatic您可以在您的页面中执行以下操作。=partial('partials/shared/navigation')类似的约定在nanoc中如何运作? 最佳答案 这里是nanoc的作者。在nanoc中,部分是布局。因此,您可以拥有layouts/partials/shared/

  9. Ruby 和指南针路径与 yeoman 项目 - 2

    我安装了ruby​​、yeoman,当我运行我的项目时,出现了这个错误:Warning:Running"compass:dist"(compass)taskWarning:YouneedtohaveRubyandCompassinstalledthistasktowork.Moreinfo:https://github.com/gruUse--forcetocontinue.Use--forcetocontinue.我有进入可变session目标的路径,但它不起作用。谁能帮帮我? 最佳答案 我必须运行这个:geminstallcom

  10. node.js - 如何在 Travis CI 上的一个项目中运行 Node.js 和 Ruby 测试 - 2

    我有一个包含多个组件的存储库,其中大部分是用JavaScript(Node.js)编写的,一个是用Ruby(RubyonRails)编写的。我想要一个.travis.yml文件来触发一个运行每个组件的所有测试的构建。根据thisTravisCIGoogleGroupthread,目前还没有官方支持。我的目录结构是这样的:.├──构建服务器├──核心├──扩展├──网络应用├──流浪文件├──package.json├──.travis.yml└──生成文件我希望能够运行特定版本的Ruby(2.2.2)和Node.js(0.12.2)。我已经有了一个make目标,所以maketest在每

随机推荐