自分のJavaScript武器庫を作る
10641 ワード
前言
業務の最前線での戦いの先として、残業を少なくするには、仕事の効率を高める工夫が必要です.ここでは、ビジネス開発の過程で、日付フォーマット、urlパラメータのオブジェクトの転送、ブラウザのタイプの判断、節流関数などの関数を繰り返し使用しています.これらのツール類の関数は、基本的には各項目で使用されます.開発効率を向上させる.
常用関数のまとめ
ここでは先に分類して整理して、以前のプロジェクトで何回も使われたツール関数です.
1.アラy
1.1 arrayEqual
2.1 addClass
3.1 get Cookie
4.1 get Explore
上記のような一般的な関数を実装する以外に、最も重要なのは合理化の導入をサポートすることであり、ここでは
しかし、これではやはり満足できません.全部のライブラリを導入したので、少し浪費しました.私たちはすべての関数を使うことができません.じゃ、必要に応じて導入します.
1.ディレクトリ構造説明
ここでは主に、プロジェクトの
テストの を かない は いプログラマではないということです.それはお めできません.
しかし、 な のため、 プロジェクトは にプロジェクトの
ここでは、 な ライブラリ
リリース
まず
1. の を する
2.ユニットテスト
3.テストと
4.npmにリリース
1.ブラウザ
業務の最前線での戦いの先として、残業を少なくするには、仕事の効率を高める工夫が必要です.ここでは、ビジネス開発の過程で、日付フォーマット、urlパラメータのオブジェクトの転送、ブラウザのタイプの判断、節流関数などの関数を繰り返し使用しています.これらのツール類の関数は、基本的には各項目で使用されます.開発効率を向上させる.
常用関数のまとめ
ここでは先に分類して整理して、以前のプロジェクトで何回も使われたツール関数です.
1.アラy
1.1 arrayEqual
/**
*
* @desc
* @param {Array} arr1
* @param {Array} arr2
* @return {Boolean}
*/
function arrayEqual(arr1, arr2) {
if (arr1 === arr2) retur true;
if (arr1.length != arr2.length) return false;
for(var i = 0; i < arr1.length; ++i) {
if (arr1[i] !== arr2[i]) return false;
}
return true;
}
2.クラス2.1 addClass
/**
*
* @desc class
* @param {HTMLElement} ele
* @param {String} cls
*/
var hasClass = require('./hasClass');
fuction addClass(ele, cls) {
if(!hasClass(ele, cls)) {
ele.className += ' ' + cls;
}
}
2.2 hasクラス/**
*
* @desc class
* @param {HTMLElement} ele
* @param {String} cls
* @return {Boolean}
*/
function hasClass(ele, cls) {
return (new RegExp('(\\s|^)' + cls + '(\\s|$)')).test(ele.className);
}
2.3レモベクラス/**
*
* @desc class
* @param {HTMLElement} ele
* @param {String} cls
*/
var hasClass = require('./hasClass');
function removeClass(ele, cls) {
if (hasClass(ele, cls)) {
var reg = new RegExp('(\\s|^)'+ cls + '(\\s|$)');
ele.className = ele.className.replace(reg, ' ');
}
}
3.Cookie3.1 get Cookie
/**
*
* @desc name cookie
* @param {String} name
* @return {String}
*/
function getCookie(name) {
var arr = document.cookie.replace(/\s/g, "").split(';');
for (var i = 0; i < arr.length; i++) {
var tempArr = arr[i].split('=');
if (tempArr[0] == name) {
return decodeURIComponent(tempArr[1]);
}
}
return'';
}
3.2 removeCookievar setCookie = require('./setCookie');
/**
*
* @desc name cookie
* @param {String} name
*/
function removeCookie(name) {
// , cookie
setCookie(name, '1', -1);
}
3.3 set Cookie/**
*
* @desc Cookie
* @param {String} name
* @param {String} value
* @param {Number} days
*/
function setCookie(name, value, days) {
var date = new Date();
date.setDate(date.getDate() + days);
document.cookie = name + '='+ value + ';expires=' + date;
}
4.サービス4.1 get Explore
/**
*
* @desc
* @return {String}
*/
function getExplore() {
var sys = {},
ua = navigator.userAgent.toLowerCase(), s;
(s = ua.match(/rv:([\d.]+)\) like gecko/)) ? sys.ie = s[1]:
(s = ua.match(/msie ([\d\.]+)/)) ? sys.ie = s[1] :
(s = ua.match(/edge\/([\d\.]+)/)) ? sys.edge = s[1] :
(s = ua.match(/firefox\/([\d\.]+)/)) ? sys.firefox = s[1] :
(s = ua.match(/(?:opera|opr).([\d\.]+)/)) ? sys.opera = s[1] :
(s = ua.match(/chrome\/([\d\.]+)/)) ? sys.chrome = s[1] :
(s = ua.match(/version\/([\d\.]+).*safari/)) ? sys.safari = s[1] : 0;
//
if (sys.ie) return ('IE: ' + sys.ie)
if (sys.edge) return ('EDGE: ' + sys.edge)
if (sys.firefox) return ('Firefox: ' + sys.firefox)
if (sys.chrome) return ('Chrome: ' + sys.chrome)
if (sys.opera) return ('Opera: ' + sys.opera)
if (sys.safari) return ('Safari: ' + sys.safari)
return'Unkonwn'
}
4.2 getOS/**
*
* @desc
* @return {String}
*/
function getOS() {
var userAgent = 'navigator' in window && 'userAgent' in navigator &&navigator.userAgent.toLowerCase() || '';
var vendor = 'navigator' in window && 'vendor' in navigator && navigator.vendor.toLowerCase() || '';
var appVersion = 'navigator' in window && 'appVersion' in navigator &&navigator.appVersion.toLowerCase() || '';
if (/mac/i.test(appVersion)) return'MacOSX'
if(/win/i.test(appVersion)) return 'windows'
if (/linux/i.test(appVersion)) return 'linux'
if (/iphone/i.test(userAgent) || /ipad/i.test(userAgent)||/ipod/i.test(userAgent))'ios'
if (/android/i.test(userAgent)) return 'android'
if (/win/i.test(appVersion) && /phone/i.test(userAgent)) return
'windowsPhone'
}
パッケージ上記のような一般的な関数を実装する以外に、最も重要なのは合理化の導入をサポートすることであり、ここでは
webpack
を使用して統一的にUMD
共通のモジュール仕様に包装し、webpack
、RequireJS
などのモジュール搭載器をサポートしたり、SeaJS
タグを通して直接導入したりします.しかし、これではやはり満足できません.全部のライブラリを導入したので、少し浪費しました.私たちはすべての関数を使うことができません.じゃ、必要に応じて導入します.
1.ディレクトリ構造説明
│ .babelrc
│ .gitignore
│ .travis.yml
│ LICENSE
│
package.json
│ README.md
│ setCookie.js // ,
│ setScrollTop.js
│ stringfyQueryString.js
│ ...
│ ...
│
├─min
│ outils.min.js //
│
├─script //
│ build.js //
│ test.js //
│ webpack.conf.js // webpack
│
├─src //
│ │ index.js // webpack
│ │
│ ├─array
│ │
│ ├─class
│ │
│ ├─cookie
│ │
│ ├─device
│ │
│ ├─dom
│ │
│ ├─keycode
│ │
│ ├─object
│ │
│ ├─random
│ │
│ ├─regexp
│ │
│ ├─string
│ │
│ ├─support
│ │
│ ├─time
│ │
│ └─url
│
└─test //
│ array.test.js
│
clas.test.js
│ cookie.test.js
│ device.test.js
│ dom.test.js
│ index.html
│ keycode.test.js
│
objec.test.js
│ random.test.js
│ regexp.test.js
│
string.test.js
│ support.test.js
│ time.test.js
│ url.test.js
│
└─_lib //
mocha.css
mocha.js
power-assert.js
2.スクリプトの構築ここでは主に、プロジェクトの
の プロセスの を し、フルボリュームの パケットを し、build.js
のディレクトリの のmin
を し、outils.min.js
で し、 しい パケットをwebpack
ディレクトリに する. ......
......
//
rm(path.resolve(rootPath, 'min', `${pkg.name}.min.js`), err => {
if (err) throw (err)
webpack(config, function (err, stats) {
if (err) throw (err)
building.stop()
pocess.stdout.write(stats.toString({
colors: true,
modules: false,
children: false,
chunks: false,
chunkModules: false
}) + '
')
resolve()
console.log(chalk.cyan(' Build complete.
'))
})
})
......
......
のステップは、 モジュールをルートディレクトリにコピーし、ルートディレクトリ の の モジュールを し、min
の の のディレクトリのすべてのsrc
ファイルをルートディレクトリにコピーする.これはルートにコピーし、 に js
('outils/')で された を し、 を させることが です.//
......
......
//
rm('*.js', err => {
if (err) throw(err)
let folderList = fs.readdirSync(path.resolve(rootPath, 'src'))
folderList.forEach((item, index) => {
// `src` `js`
copy(`src/${item}/*.js`, rootPath, function (err, files) {
if (err) throw err;
if (index === folderList.length - 1) {
console.log(chalk.cyan(' Copy complete.
'))
copying.stop()
}
})
})
})
......
......
3. の テストの を かない は いプログラマではないということです.それはお めできません.
しかし、 な のため、 プロジェクトは にプロジェクトの
require
を して、test.js
サーバを して、koa
ページの のテストページをロードして、 にプロジェクトを かせる 、 で をテストすることができます.しかし、その は、mocha
と してtrvis-ciを いて に され、Github
に に される.npm
に り えて、karma
、mocha
でユニットテストをして、power-assert
を ってカバー をテストします.この は き き します.ここでは、 な ライブラリ
Coverage
を します.このライブラリはpower-assert
のassert(value,[message])
を えています.API
は に です.これからはもう しなくても です. プロジェクトのすべてのテストケースはAPI
tディレクトリの にあります.リリース
まず
tes
に けてください.もちろんGithub
のプロジェクトに に してもいいです. のプロジェクトで を げます.1. の を する
fork
ディレクトリの で、 ディレクトリを したり、カテゴリを したりして、サブフォルダに モジュールファイルを します.**
*
* @desc NaN
* @param {Any} value
* @return {Boolean}
*/
function isNaN(value) {
return value !== value;
};
modules.export = isNaN
src
ファイルでisNaN を したことを えてください.2.ユニットテスト
JS
ファイルの describe('#isNaN()', function () {
it(`outils.isNaN(NaN) should return true`, function() {
assert(outils.isNaN(NaN))
})
it(`outils.isNaN('value') should return false`, function () {
assert.notEqual(outils.isNaN(NaN))
})
})
src/index.js
に される に されたテストケーススクリプトを する.3.テストと
test
を して、すべてのテストケースが るかどうかを ます. がなければ、test/index.html
を して し、 のnpm run test
に すればいいです.4.npmにリリース
npm run build
でアカウントを し、github
の のwww.npmjs.com
、package.json
、name
などの を して、 にversion
が きな を めました. :author
に して、ミラーソースをnpm publish
に るには、npm
などの のミラーソースを するとエラーが します.1.ブラウザ
www.npmjs.com
ディレクトリ のcnpm
を ダウンロードしてmin
タグで します.
var OS = outils.getOS() 注意: 本仓库代码会持续更新,如果你需要不同版本的增量压缩包或源码,请到
github Release
页面下载对应版本号的代码。2.Webpack、RequireJS、SeaJS等模块加载器
先使用
npm
安装outils
。おすすめの使い方$ npm install --save-dev outils // const outils = require('outils') const OS = outils.getOS()
もちろん、あなたの開発環境にはバルベルコンパイルES 6文法があります.// require('outils/') const getOS = require('outils/getOS') const OS = getOS()
締め括りをつけるimportgetOS from'outils/getOS' // import { getOS } from"outils";
ここでは簡単なパッケージだけで、outils.min.js
に公開されています.次のコピー貼り付けの手間を省きます.または直接の です. をよくしようとするなら、まず を することです. なりの があれば、 しても みになります.O(∩∩)Oははは~