我一直在使用Webpack,Sass和CSS模块构建一个项目.通常在我的.scss文件中,我定义了一个类,如:
:local(.button) {
color: white;
}
Run Code Online (Sandbox Code Playgroud)
在我的React组件中,在render方法中,我需要样式:
render = () => {
const styles = require('./MyStyles.scss');
<div className={ styles.button } />
}
Run Code Online (Sandbox Code Playgroud)
这一切对世界都很好.一切都按预期工作.
今天我正在阅读CSS模块页面,注意到没有一个选择器:local()像我一样被包含,而且他们导入的样式如下:
import styles from './MyStyles.scss';
Run Code Online (Sandbox Code Playgroud)
而且我觉得"哇看起来好多了,它更容易看到它被导入的地方等等.而且我不想使用它:local(),只是默认情况下本地的东西." 所以我尝试了,并立即遇到了几个问题.
1)`从'./MyStyles.scss'导入样式;
因为我在我的React文件上使用ESLint,所以我立即得到一个MyStyles.scss没有默认导出的错误,这通常是有意义的但是CSS Modules页面说明了:
从JS模块导入CSS模块时,它会导出一个对象,其中包含从本地名称到全局名称的所有映射.
所以我自然希望样式表的默认导出也是他们所指的对象.
2)我试过了 import { button } from './MyStyles.scss';
这会通过linting但button日志为undefined.
3)如果我恢复require导入我的样式的方法,:local未定义的任何内容都是未定义的.
作为参考,我的webpack加载器(我还包括Node-Neat和Node-Bourbon,两个很棒的库):
{ test: /.(scss|css)$/, loader: 'style!css?sourceMap&localIdentName=[local]___[hash:base64:5]!resolve-url!sass?outputStyle=expanded&sourceMap&includePaths[]=' + encodeURIComponent(require('node-bourbon').includePaths) +
'&includePaths[]=' + encodeURIComponent(require('node-neat').includePaths[1]) + '&includePaths[]=' …Run Code Online (Sandbox Code Playgroud) 给定两个数组,其中一个是旧的值集,另一个是新值,我想找到这两个数组的"差异",这样对原始数组的更新可以表示为:
enum CollectionChange<T: SequenceType> {
case Initial(T)
case Update(T, deletions: [Int], insertions: [Int], modifications: [Int])
}
Run Code Online (Sandbox Code Playgroud)
我试图建立的简化版本这是更改对象基于对象的平等而建,而不是作为指标RAC-MutableCollectionProperty是(对于该代码是在这里,什么可能是代码的最复杂的位,我在看到虽然;没有文件没有帮助).
此项目的另一个重要功能是能够以任何粒度级别观察阵列的更改.例如,一个一维阵列,限制T到Equatable,是一个相对容易的用例.您可以RAC-MutableCollectionProperty构建某种描述更改的表,检查对象的相等性.然而,一旦你开始使用二维数组并且更深入,它会变得有点棘手,因为你不仅需要在最低级别对元素进行区分,还要描述区段级别的删除.实际上,实际上只需要2D阵列,但是无论阵列深度如何,都可以使用一个解决方案.我不一定在寻找解决方案(尽管这很棒),实际上只是关于如何解决这个问题的任何指针和高级解决方案.
我想到观察多个数组级别的一种方法是编写一个在单维数组上工作的diffing函数,并构造一个属性,使得:
let property: MutableCollectionProperty<MutableCollectionProperty<Int>>
Run Code Online (Sandbox Code Playgroud)
属性将检查其泛型类型是否属于自己的类型.我必须将更改描述更改为更接近的内容
enum Changes<T> {
case Initial(T)
case Update(T, deletions: [NSIndexPath], insertions: [NSIndexPath], modifications: [NSIndexPath])
}
Run Code Online (Sandbox Code Playgroud)
或者类似的东西
enum Changes<T> {
case Initial(T)
case UpdateSections(sections: [T], deletions:[Int], insertions: [Int], modifications: [Int])
case UpdateIndexes(T, deletions: [Int], insertions: [Int], modifications: [Int])
}
Run Code Online (Sandbox Code Playgroud)
这些只是我的初步想法,但我愿意接受任何解决方案或建议.
BOUNTY编辑:
奖金将颁发给能够提供给出以下参数的解决方案的人:
T: Equatable我想在UIView上的子类上绘制文本,以便从文本中剪切出文本,并在视图后面显示背景,就像在此处找到的OSX Mavericks徽标一样.
我会说我更像是一个中级/早期的高级iOS开发人员,所以请随意向我提出一些疯狂的解决方案.我希望我必须覆盖drawRect才能做到这一点.
多谢你们!
编辑:
我应该提一下,我的第一次尝试是使文本[UIColor clearColor]无效,因为只是将文本的alpha分量设置为0,这只是通过文本显示视图.
我正在构建一个同构的React/React-Router/Redux/Webpack应用程序,我正在尝试实现服务器端渲染.
我的目录如下:
/client
/actions
/components
/containers
/server
/server.js
Run Code Online (Sandbox Code Playgroud)
在我的webpack配置中,我为客户端内的所有文件夹设置了别名:
var path_base = path.resolve(__dirname, '..');
const resolve = path.resolve;
const base = function() {
var args = [path_base];
args.push.apply(args, arguments);
return resolve.apply(resolve,args);
};
const resolve_alias = base.bind(null, 'src/client');
const aliases = [
'actions',
'components',
'constants',
'containers',
'middleware',
'reducers',
'routes',
'store',
'styles',
'utils',
'validation'
];
Run Code Online (Sandbox Code Playgroud)
所以在webpack捆绑的代码中,我可以这样做:
import { Widget } from 'components';
Run Code Online (Sandbox Code Playgroud)
并且该导入由webpack解决.
现在在我的服务器代码中,为了进行渲染,我必须导入一些我的客户端文件,比如routes/index.js.我快到的时候我输入我的路线文件的问题,它使用的WebPack别名到另一个文件,说components还是containers那么自然,节点JS需要系统无法解决它.
我该如何解决这类问题?我看了这个问题,它谈到了基本上使用mock-require设置webpack中存在的相同别名.但后来问题变成了我的路径文件导入我的所有组件,然后所有导入的东西,如样式表,图像等.我应该使用像webpack-isomorphic-tools这样的东西吗?
我一直在看的指南(例如这个)都非常擅长展示服务器端渲染是如何完成的,但它们都没有真正谈论如何解决所有需求和诸如此类的东西.
每当我构建我的测试目标(Xcode生成的标准目标)时,构建就会失败并出现一个神秘的错误:
framework not found Pods_AppName_AppNameTests
Run Code Online (Sandbox Code Playgroud)
我认为这意味着我的测试的pod生成目标无法找到.我的podfile非常简单:
use_frameworks!
target 'AppName' do
pod 'ReactiveCocoa'
pod 'RealmSwift'
pod 'ObjectMapper'
pod 'Moya'
pod 'Moya/ReactiveCocoa'
pod 'pop'
pod 'Heimdallr'
pod 'Heimdallr/ReactiveCocoa'
pod 'Alamofire'
pod 'AlamofireImage'
pod 'SwiftDate'
pod 'DropdownAlert'
pod 'NibDesignable'
target 'AppNameTests' do
pod 'Quick'
pod 'Nimble'
end
end
Run Code Online (Sandbox Code Playgroud)
我正在使用Cocoapods 1.0.1.
编辑:
它不是我的podfile的格式.这是通过运行pod init给我的默认设置.cocoapods中可能存在一个错误,但格式是正确的.
编辑2:
如果我包括:
inherit! search_paths
Run Code Online (Sandbox Code Playgroud)
在我的测试目标中,测试失败说:
The bundle “MyApp_Tests” couldn’t be loaded because it is damaged or missing necessary resources. Try reinstalling the bundle.
Run Code Online (Sandbox Code Playgroud)
如果没有该行,测试也无法构建,但这次出现了链接器错误:
Ld /Users/travis/Library/Developer/Xcode/DerivedData/Reactify-fqgxzcgedmqljrangqdkxpwdfxne/Build/Intermediates/Reactify.build/Debug-iphonesimulator/Reactify_Tests.build/Objects-normal/i386/Reactify_Tests normal i386
特殊错误来自Travis,但我在Xcode中获得了同样的错误.
Passport似乎是简单身份验证的一个很好的选择,不引人注目且不易设置.我正在构建一个使用JWT进行身份验证的MEAN堆栈,因此我查看了Passport JWT.然而,有一些我很困惑的事情.
1)假设Passport JWT仅用于验证请求,而不是用于生成有效的jwt,我是否正确?也就是说,它是否应仅用于验证令牌的存在?
2)passport.authorize和之间有什么区别passport.authenticate?我何时应该使用另一个?
3)我有3条路线我使用的身份验证相关事宜,login,signup,和authenticate.
login将检查用户电子邮件/密码组合是否存在并匹配,然后为客户端生成令牌.
signup将检查以确保电子邮件尚不存在,然后为客户端生成令牌.现在,authenticate这是我有点混淆的地方.authenticate如果我已经拥有login并且我还需要一条路线signup吗?如果有的话,似乎authenticate将是我passport.use为JWT策略传递的功能然后login并且signup可能添加verify_token路线将是我唯一的无保护路线,其他一切将调用passport.authenticate或passport.authorize.
我使用Model View ViewModel范例开发iOS应用程序来构建我的视图控制器并表示它们的数据.与ReactiveCocoa一起使用是一个强大的工具; 视图控制器变得不那么臃肿,视图模型更容易测试,并且关注点明显分离.
我对这个特定架构的一个问题是,像MVC一样,仍然没有一个明确的地方或方法来构建网络代码.采取以下简单的例子:
class HomepageViewModel {
var posts: MutableProperty<[Post]> = MutableProperty([])
func fetchPosts() -> SignalProducer<[Post], NSError> {
return SignalProducer { observer, disposable in
// do some networking stuff
let posts = ....
observer.sendNext(posts)
observer.sendCompleted()
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后在我的视图控制器中的某个地方,我可以做:
self.viewModel.posts <~ self.viewModel.fetchPosts().on(next: { _ in self.collectionView.reloadData() })
Run Code Online (Sandbox Code Playgroud)
对我来说,感觉使用MVVM的重点是不要将视图和视图控制器(我称之为视图表示层)暴露给任何网络代码,但我仍然需要一种能够观察到新内容的方法.在不知道具体细节的情况下获取,只是发生了成功的获取.我想这会是这样的:
self.viewModel.contentUpdatedSignal.observeNext { _ in self.collectionView.reloadData() }
Run Code Online (Sandbox Code Playgroud)
与此同时,我也不想失去将信号和信号生成器绑定到我使用的可变属性的能力<~.
class ViewModel {
let someProperty = MutableProperty<[SomeModel]>([])
var (contentUpdatedSignal, observer) = Signal.pipe()
init() {
self.someProperty <~ self.fetchContent().on(next: { _ in …Run Code Online (Sandbox Code Playgroud) 如何使用URL中的所有参数发送POST带有AFNetworking2.0 的请求,如下所示:
http://www.myserver.com?api_key=something&lat=2.4&radius=100
现在我有:
NSString* query = @"http://example.com?name=param&date=param";
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *parameters = @{};
[manager POST:query parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
Run Code Online (Sandbox Code Playgroud)
但它没有用,我得到了这个错误:
Error Domain=AFNetworkingErrorDomain Code=-1011 "Request failed: bad request (400)
我最近工作的开发人员之一离开了他的sass代码,我发现了这个:
%centerAll {
display: block;
position: relative;
top: 50%;
left: 50%;
-webkit-transform: translate(-50%, -50%);
-ms-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
}
Run Code Online (Sandbox Code Playgroud)
我会说我对sass非常有经验,但我从未在Sass中看到任何使用模数运算符的东西.为了使事情变得更加奇怪,这个"mixin"包含在代码中:
@extend %centerAll
据我所知@extend,通过继承用于扩展类的属性.
有没有人见过这个?
我正在使用具有此目录结构的React和Webpack构建Web应用程序
/src
/components
/containers
App.js
App.scss
/assets
/fonts
MarkOT/
MarkOT.css
MarkOT.eot
...
...
/images
/styles
_vars.scss
Run Code Online (Sandbox Code Playgroud)
我正试图_vars.scss从App.scss这样导入:
@import '../../styles/vars';
Run Code Online (Sandbox Code Playgroud)
这工作得很好.什么是行不通的,如果我有进口_vars.scss
@import "../assets/fonts/MarkOT-ExtraLight/MarkOT-ExtraLight.css";
@import "../assets/fonts/MarkOT-Light/MarkOT-Light.css";
@import "../assets/fonts/MarkOT/MarkOT.css";
@import "../assets/fonts/MarkOT-Medium/MarkOT-Medium.css";
@import "../assets/fonts/MarkOT-Book/MarkOT-Book.css";
Run Code Online (Sandbox Code Playgroud)
那些导入应该相对于styles文件夹解析.而是相对于进口得到解决containers/App/App.scss.我在sass-loader网站上看到,应该使用它resolve-url-loader来解决这个问题,但我无法让它工作.
对like的导入@import "~../assets/fonts/MarkOT-ExtraLight/MarkOT-ExtraLight.css";只包含一个@font-face声明:
@font-face {
font-family: 'MarkOT';
src: url('MarkOT.eot?#iefix') format('embedded-opentype'), url('MarkOT.otf') format('opentype'),
url('MarkOT.woff') format('woff'), url('MarkOT.ttf') format('truetype'), url('MarkOT.svg#MarkOT') format('svg');
font-weight: normal;
font-style: normal;
}
Run Code Online (Sandbox Code Playgroud)
这是我的webpack配置:
var webpack = require('webpack');
var path = require('path');
var …Run Code Online (Sandbox Code Playgroud) ios ×5
css ×3
reactjs ×3
sass ×3
webpack ×3
objective-c ×2
swift ×2
architecture ×1
arrays ×1
cocoapods ×1
css-modules ×1
jwt ×1
mean-stack ×1
mvvm ×1
node.js ×1
passport.js ×1
redux ×1