Programming
Parse dont validate
https://lexi-lambda.github.io/blog/2019/11/05/parse-don-t-validate/
defined for all possible inputs.
Turning partial functions total
partial: 类型不具体,也就是类型与场景要求不符
实现一个:返回 [] 第一位的函数的类型。由于数组可能为空,所以直接返回第一位,也就可能返回空,第一种类型是不正确的,所以可以非常简单地通过 Maybe 来实现。
但实际是,返回 [] 第一位,这个函数功能成立,本身就建立在,数组必须不是空的前提下,所以该函数参数的类型,应该是一个 非空数组。
head :: [a] -> a // wrong
head :: [a] -> Maybe a // 改变返回类型,简单,但不可取
head :: NonEmpty a -> a // 正确设置参数类型,也就是缩小参数类型范围
类型是对可能性的思考/预知,所以如果不可能,类型就不正确。
validation and parsing lies almost entirely in how information is preserved validateNonEmpty always returns (), the type that contains no information, but parseNonEmpty returns NonEmpty a, a refinement of the input type that preserves the knowledge gained in the type system. parseNonEmpty gives the caller access to the information it learned, while validateNonEmpty just throws it away.
type-driven design
Less/Css
import
less 文件中 @import 相当于将引入的文件内容,复制入当前 less 文件,所以此时的 @import 处文件的内容,会被匹配为当前 less 文件的处理逻辑(所以如果开启了 CSS-Module 就会被 CSS-Module 处理),也就是即使是多个文件,视为一个文件处理(即使 @import (css)
依旧不会单独处理)。
https://webpack.js.org/loaders/less-loader/#imports
@import 处理机制与 esimport 不同需要注意。@import 属于 less 语法,less 源文件即是webpack匹配(test & resourceQuery)的文件地址,其他通过 @import 引入的文件则进入相同的处理 oneOf,且不受exclude与include影响。
less-loader 中解析逻辑也可看出,less 文件会直接被解析处结果(引入文件直接受 less 往内的逻辑解析,不再经过webpack的规范了),内部的 imports 则只是作为 webpack-dependencies 用于监听变化响应
https://github.com/webpack-contrib/less-loader/blob/master/src/index.js#L47-L73
另外也支持自定义 less 解析器,默认是 ‘less’
const implementation = getLessImplementation(this, options.implementation);
function getLessImplementation(loaderContext, implementation) {
let resolvedImplementation = implementation;
if (!implementation || typeof implementation === "string") {
const lessImplPkg = implementation || "less";
try {
// eslint-disable-next-line import/no-dynamic-require, global-require
resolvedImplementation = require(lessImplPkg);
} catch (error) {
loaderContext.emitError(error);
// eslint-disable-next-line consistent-return
return;
}
}
// eslint-disable-next-line consistent-return
return resolvedImplementation;
}
所以 在js环境中 import 样式文件,才会被作为单独的文件处理,也就可以通过 include,exlude 进行 webpack 细分处理。