JS基础(一)

55 阅读2分钟
<!DOCTYPE html>
<html lang="en" xmlns:script="http://www.w3.org/1999/html">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div class="calculator J_calculator">
    <p>结果:<span class="result">0</span></p>
    <div class="input-group">
        <input type="text" placeholder="第一个数字" value="0">
        <input type="text" placeholder="第二个数字" value="0">
    </div>
    <div class="button-group">
        <button data-method="plus">+</button>
        <button data-method="minus">-</button>
        <button data-method="multiplication">*</button>
        <button data-method="division">/</button>
    </div>
    <script src = "./tools.js"></script>
    <script>
        // 以下js代码
    </script>
</body>
</html>
    
  1. 初步实现计算器代码
const oCalculator = document.getElementsByClassName("J_calculator")[0],
    oResult = oCalculator.getElementsByClassName("result")[0],
    fInput = oCalculator.getElementsByTagName('input')[0],
    sInput = oCalculator.getElementsByTagName("input")[1],
    oButtonGroup = oCalculator.getElementsByClassName('button-group')[0]

oButtonGroup.addEventListener("click", onBtnClick, false)

function onBtnClick(evt) {
    const e = evt || window.event,
        tar = e.target || e.srcElement,
        tagName = tar.tagName.toLowerCase();
    if (tagName === 'button') {
        const fvalue = Number(fInput.value.replace(/\s+/g, '')) || 0
        const svalue = Number(sInput.value.replace(/\s+/g, '')) || 0
        var method = tar.getAttribute('data-method')
        switch (method) {
            case 'plus':
                oResult.innerText = fvalue + svalue
                break;
            case 'minus':
                oResult.innerText = fvalue - svalue
                break;
            case 'multiplication':
                oResult.innerText = fvalue * svalue
                break;
            case 'division':
                oResult.innerText = fvalue / svalue
                break;
            default:
                break;
        }
    }
}
  1. 解决作用域问题
;(function () {
    const oCalculator = document.getElementsByClassName("J_calculator")[0],
        oResult = oCalculator.getElementsByClassName("result")[0],
        fInput = oCalculator.getElementsByTagName('input')[0],
        sInput = oCalculator.getElementsByTagName("input")[1],
        oButtonGroup = oCalculator.getElementsByClassName('button-group')[0]
    var init = function () {
        bindEvent()
    }
    function bindEvent(){
        oButtonGroup.addEventListener("click", onBtnClick, false)
    }
    function onBtnClick(evt){
        const e = evt || window.event,
            tar = e.target || e.srcElement,
            tagName = tar.tagName.toLowerCase();
        if (tagName === 'button') {
            const fvalue = Number(fInput.value.replace(/\s+/g, '')) || 0
            const svalue = Number(sInput.value.replace(/\s+/g, '')) || 0
            var method = tar.getAttribute('data-method')
            switch (method) {
                case 'plus':
                    oResult.innerText = fvalue + svalue
                    break;
                case 'minus':
                    oResult.innerText = fvalue - svalue
                    break;
                case 'multiplication':
                    oResult.innerText = fvalue * svalue
                    break;
                case 'division':
                    oResult.innerText = fvalue / svalue
                    break;
                default:
                    break;
            }
        }
    }
    init()
})()
  1. 解决作用域和函数单一性问题
    // tools.js 
var tools = (function () {
    function digitalize(str) {
        return Number(str.replace(/\s+/g, '')) || 0
    }
    function getTarget(evt){
        var e = evt || window.event;
        return e.target || e.srcElement;
    }
    return {
        digitalize:digitalize,
        getTarget:getTarget
    }
})();
// *************分隔符*************
;(function (doc,tools) {
    const oCalculator = doc.getElementsByClassName("J_calculator")[0],
        oResult = oCalculator.getElementsByClassName("result")[0],
        fInput = oCalculator.getElementsByTagName('input')[0],
        sInput = oCalculator.getElementsByTagName("input")[1],
        oButtonGroup = oCalculator.getElementsByClassName('button-group')[0]
    var init = function () {
        bindEvent()
    }

    function bindEvent() {
        oButtonGroup.addEventListener("click", onBtnClick, false)
    }

    function onBtnClick(evt) {
        const tar = tools.getTarget(evt)
            tagName = tar.tagName.toLowerCase();
        if (tagName === 'button') {
            const fvalue = tools.digitalize(fInput.value.replace(/\s+/g, ''))
            const svalue = tools.digitalize(sInput.value.replace(/\s+/g, ''))
            var method = tar.getAttribute('data-method')
            var result = compute(method, fvalue, svalue)
            renderResult(result)
        }
    }

    function compute(method, fvalue, svalue) {
        let result = ''
        switch (method) {
            case 'plus':
                result = fvalue + svalue
                break;
            case 'minus':
                result = fvalue - svalue
                break;
            case 'multiplication':
                result = fvalue * svalue
                break;
            case 'division':
                result = fvalue / svalue
                break;
            default:
                break;
        }
        return result
    }

    function renderResult(result) {
        oResult.innerText = result
    }

    init()
})(document,tools)

webpack

  1. 安装依赖
1. 安装三大件
    webpack
    webpack-cli
    webpack-dev-server
2. 需要处理的模块
    // 转换es6的模块
    babel-loader@7
    babel-core
    babel-preset-env
    //  转换ES67的模块 装饰器等
    babel-plugin-transform-runtime
    babel-plugin-transform-decorators
    babel-plugin-transform-decorators-legacy
3. css预处理程序
    //sass
    sass-loader
    node-sass
    css-loader
    postcss-loader autoprefixer
    style-loader
4. 处理模板
    ejs-loader
5. 处理html
    html-webpack-plugin
  1. 开发依赖和生产依赖的区别

    --save-dev 等同于 -D 安装在开发环境下的依赖

    --save 等同于 -S 安装在生产环境下的依赖

  2. package.json

{
  "name": "xiao_ye",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo "Error: no test specified" && exit 1",
    "dev": "SET NODE_OPTIONS=--openssl-legacy-provider && webpack-dev-server --content-base dist/ --hot --config webpack.config.js --progress --display-modules --colors --display-reasons"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
  },
  "devDependencies": {
    "@babel/core": "7.4.5",
    "babel-core": "6.26.3",
    "babel-loader": "8.0.6",
    "babel-preset-env": "1.7.0",
    "html-webpack-plugin": "3.2.0",
    "webpack": "4.35.0",
    "webpack-cli": "3.3.5",
    "webpack-dev-server": "3.7.2",
    "autoprefixer": "^10.4.16",
    "babel-plugin-transform-decorators": "^6.24.1",
    "babel-plugin-transform-decorators-legacy": "^1.3.5",
    "babel-plugin-transform-runtime": "^6.23.0",
    "css-loader": "^6.8.1",
    "ejs-loader": "^0.5.0",
    "node-sass": "^9.0.0",
    "postcss-loader": "^7.3.3",
    "sass-loader": "^13.3.3",
    "style-loader": "^3.3.3"
  }
}
  1. 配置webpack -- webpack.config.js
const path = require('path')
const HtmlWebpackPlugin = require("html-webpack-plugin")
const autoprefixer = require("autoprefixer")
module.exports = {
    mode: "development",
    entry: {
        index: "./src/js/index.js"
    },
    output: {
        path: path.resolve(__dirname, "dist"),
        filename: "js/bundle.js"
    },
    module: {
        rules: [
            {
                test: /.js$/,
                loader: "babel-loader",
                exclude: __dirname + "node_modules",
                include: __dirname + "src",
                options: {
                    "presets": ["env"]
                }
            },
            {
                test: /.css$/,
                use: [
                    {loader: "style-loader"},
                    {loader: "css-loader"},
                    {
                        loader: "postcss-loader",
                        options: {
                            plugins: function () {
                                return [autoprefixer('last 5 versions')]
                            }
                        }
                    }
                ]
            },
            {
                test: //.scss$/,
                use: [{loader: "style-loader"},
                    {loader: "css-loader"}, {loader: "sass-loader"}]
            },
            {
                test: /.tpl$/,
                loader: 'ejs-loader'
            }
        ]
    },
    plugins: [
        new HtmlWebpackPlugin({
            minify: {
                // 移除所有注释
                removeComments: true,
                // 去掉所有的换行空格
                collapseWhitespace: true
            },
            filename: "index.html",
            template: path.resolve(__dirname, "src/index.html"),
            excludeChunks: ["node_modules"],
            files: {
                js: ["js/index.js"],
                chunks: {
                    "main": {
                        "entry": "dist/bundle.js"
                    }
                }
            }
        })
    ],
    devServer: {
        watchOptions: {
            ignore: /node_modules/
        },
        host: 'localhost',
        port: 3000,
        open: true
    }
}